zoukankan      html  css  js  c++  java
  • Head First 设计模式 --11 代理模式

    代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。

     代码:

    interface Boss {
      public void meeting();
    }
    
    class BossImp implements Boss {
      @Override
      public void meeting() {
        System.out.println("meeting ....");
      }
    }
    
    class SecretaryProxy implements Boss {
      private Boss boss;
    
      public SecretaryProxy(Boss boss) {
        this.boss = boss;
      }
    
      @Override
      public void meeting() {
        System.out.println("before meeting ....");
        boss.meeting();
      }
    }
    
    public class ProxyTest {
      public static void main(String[] args) {
        Boss boss = new BossImp();
        SecretaryProxy proxy = new SecretaryProxy(boss);
        proxy.meeting();
      }
    }

    类图:

    这里SecretaryProxy就是一个代理,在Boss开会前会通知Boss开会,还可以控制一些小的会议不用参加。

    代理模式和装饰者模式很像,都是用一个对象把被封装对象封装起来,然后调用封装的对象。但是代理模式的目的是控制对象的访问,而装饰者模式是增加对象的行为。这里还有一个小技巧如何控制客户端用的是代理而不是实际的对象,通过提供一个工厂实例化并返回代理。这个实例化的过程可以用工厂模式来实例化。代理模式和适配器模式也很像,都是挡在其他对象前面并负责将请求转发给他们。适配器会改变对象适配的接口,而代理则实现相同的接口。

    java本身也提供了一个代理类:

    public class ProxyTest {
      public static void main(String[] args) {
        User user = new UserImpl();
    
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(user);
    
        User proxy = (User) myInvocationHandler.getProxy();
    
        proxy.add();
    
        User user2 = new UserImpl2();
    
        MyInvocationHandler myInvocationHandler2 = new MyInvocationHandler(user2);
    
        User proxy2 = (User) myInvocationHandler2.getProxy();
    
        proxy2.add();
      }
    }
    
    interface User {
      public abstract void add();
    
      public abstract void delete();
    }
    
    
    class UserImpl implements User {
    
      @Override
      public void add() {
        System.out.println("i am in add()");
      }
    
      @Override
      public void delete() {
        System.out.println("i am in delete");
      }
    
      public void update() {
        System.out.println("i am in update");
      }
    }
    
    class UserImpl2 implements User {
    
      @Override
      public void add() {
        System.out.println("i am in impl2 add()");
      }
    
      @Override
      public void delete() {
        System.out.println("i am in impl2 delete");
      }
    
      public void update() {
        System.out.println("i am in impl2 update");
      }
    }
    
    
    class MyInvocationHandler implements InvocationHandler {
      private Object target;
    
      public MyInvocationHandler(Object target) {
        this.target = target;
      }
    
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("=================before====================");
        Object object = method.invoke(target, args);
        System.out.println("=================after=====================");
    
        return object;
      }
    
      public Object getProxy() {
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
            target.getClass().getInterfaces(), this);
      }
    }
  • 相关阅读:
    我所理解的MVC
    关于开发文化的思考
    使用纯C语言开始win32 sdk编程
    谈谈编译原理和其在WEB开发中的应用1
    最简单的win32程序(c语言实现)
    关于Javascript的一些心得与记忆
    Cvv.WebUtility 我的MVC框架介绍
    发现了个不错的图片网站
    轻轻松松做开发--目前网站开发的流行原素
    我的模板分析引擎类PHP的.net开发方法标签设计篇
  • 原文地址:https://www.cnblogs.com/badboyf/p/6224027.html
Copyright © 2011-2022 走看看