• 代理模式 The Proxy Pattern


    代理模式

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

    1、使用代理模式创建代表(representative)对象,让代表对象控制某个对象的访问,被代理的对象可以是远程的对象,创建开销大的对象或需要安全控制的对象。

    类图

    1、Subject:Proxy和RealSubject都实现此接口,客户可以像处理RealSubject一样处理Proxy对象。

    2、Proxy:持有Subject类型的引用(指向RealSubject)。Proxy会控制对RealSubject的访问。

    代理模式在结构上类似装饰者,但是目的不同,装饰者为对象加上行为,而代理则是控制访问。

    (一)远程代理(RMI过程)

    (二)虚拟代理示例

    1、创建了一个用来显示的ImageProxy,页面的请求将由Proxy来处理。

    2、在某个时间点,图像被返回,ImageIcon被完整实例化。

    3、下次调用到painIcon() 时,代理就委托给ImageIcon

    (三)保护代理(用Java的动态代理实现)

    在java.lang.reflect包中有自己的代理支持,利用这个包你可以在运行时动态的创建一个代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类。即java的动态代理技术。

    1、proxy上的任何方法调用都会被传入InvocationHandler类,InvocationHandler控制对RealSubject的访问。

          如下程序:

         (1)proxy.say( "tom", 10);

         (2)MyInvocationHandler的invoke(Object proxy, Method method, Object[] args)会被调用。

         (3)invoke() 方法里设置如何处理请求:可以做一些预处理;可以转发给RealSubject;也可以做其他处理。

    程序

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    interface Subject {
          public String say(String name, int age);
    }
    
    class RealSubject implements Subject {      
          public String say(String name, int age) {
                 return "Hi "+name + ", You have been " + age+" years old." ;
          }
    }
    
    class MyInvocationHandler implements InvocationHandler {
          @Override
          public Object invoke(Object proxy, Method method, Object[] args)
                       throws Throwable {
                 for ( int i = 0; i < args. length; i++) {
                       if (String. class.isInstance(args[i])) {
                            String temp = (String) args[i];
                            args[i] = temp.toUpperCase();
                      }
                }
                Subject realObj= new RealSubject();
                Object temp = method.invoke(realObj, args);
                 return temp;
          }
    }
    
    public class InvocationHandlerTest {
    
          public static void main(String[] args) {
                Subject proxy = (Subject)Proxy.newProxyInstance(
                            Subject. class.getClassLoader(),
                             new Class[]{Subject. class},
                             new MyInvocationHandler()
                            );
                String info = proxy.say("tom", 10);
                
                System. out.println(info);
          }
    }

    输出:

    Hi TOM, You have been 10 years old.

    (转载请注明出处 ^.^)

  • 相关阅读:
    [转]Linq使用心得——SelectMany替代二重foreach循环
    设计模式—装饰者模式
    设计模式—桥接模式
    iOS_autoLayout_Masonry
    排序算法
    h.264硬件解码
    FFmpegh.264解码
    AAC编解码
    socket UDP简单通讯
    socket TCP简单通讯
  • 原文地址:https://www.cnblogs.com/windlaughing/p/2989273.html
Copyright © 2020-2023  润新知