代理模式 - 结构型模式

来源:互联网 发布:阿里云服务器搭建云免 编辑:程序博客网 时间:2024/05/21 19:25
个人理解:      
    

模式类型:

    Proxy 代理模式 - 结构型模式


概述:

    对其他对象提供一种代理以控制对这个对象的访问。(Provide a surrogate or placeholder for another object to control access to it)。代理模式也叫做委托模式。
    
    使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。
    
角色:
  抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
  目标对象角色:定义了代理对象所代表的目标对象。
  代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。

代理模式的应用场景

结构图:


代理模式的优缺点
    由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
    实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

与其他相关模式
        代理则控制对对象的访问;装饰者为对象添加一个或多个功能;适配器为它所适配的对象提供了一个不同的接口
    1)适配器模式Adapter: 适配器Adapter 为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。
    2) 装饰器模式Decorator: 尽管Decorator的实现部分与代理相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。

代理模式的应用实例
    现实中,Proxy应用范围很广,现在流行的分布计算方式RMI和Corba等都是Proxy模式的应用。Spring AOP 日志等操作。
    Struts2的Form元素映射就采用了代理模式(准确的说是动态代理模式)[待考证]
代码(其实读UML图要比代码还要一目了然)
  
 //抽象角色:abstract public class Subject{           abstract public void request();}//真实角色:实现了Subject的request()方法。public class RealSubject extends Subject{     public RealSubject(){     }     public void request(){           System.out.println("From real subject.");     }}//代理角色:public class ProxySubject extends Subject{     private RealSubject realSubject; //以真实角色作为代理角色的属性      public ProxySubject(){      }     public void request(){ //该方法封装了真实对象的request方法         preRequest();         if( realSubject == null ){               realSubject = new RealSubject();         }         realSubject.request(); //此处执行真实对象的request方法           postRequest();      }     private void preRequest(){      //something you want to do before requesting     }     private void postRequest(){     //something you want to do after requesting     }}//客户端调用:Subject sub=new ProxySubject();Sub.request(); 

   
动态代理
    Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:InvocationHandler(Interface)、Proxy。在使用动态代理类时,我们必须实现InvocationHandler接口。   

    被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。

动态代理代码
package com.lee;public interface Subject {public void request();}

package com.lee;public class RealSubject implements Subject{    public RealSubject(){    }    public void request(){          System.out.println("From real subject.");    }}


package com.lee;import java.lang.reflect.Method;import java.lang.reflect.InvocationHandler;public class DynamicSubject implements InvocationHandler{     private Object sub;     public DynamicSubject(Object sub){                       this.sub = sub;     }     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {         System.out.println("before calling " + method);         method.invoke(sub,args);         System.out.println("after calling " + method);         return null;     }}

package com.lee;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class Client {static public void main(String[] args) throws Throwable {RealSubject rs = new RealSubject(); // 在这里指定被代理类InvocationHandler ds = new DynamicSubject(rs); // 初始化代理类Class cls = rs.getClass();Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), ds);subject.request();}}

运行结果:

before calling public abstract void com.lee.Subject.request()
From real subject.
after calling public abstract void com.lee.Subject.request()

所有模式

     创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
    补充模式:空对象模式


参考/转自
http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924
http://www.cnblogs.com/cbf4life/archive/2010/01/27/1657438.html
http://blog.csdn.net/jackiehff/article/details/8621517



转载请注明:http://blog.csdn.net/paincupid/article/details/43926757

0 0