代理模式-Proxy

名称:

     代理模式(Proxy Pattern)-对象结构型模式

 

问题:

    The Proxy design pattern Provides a surrogate or placeholder for another object to control access to it.

    为其他对象提供一种代理以控制对这个对象的访问。

 

适用性:

    -远程代理为一个对象在不同的地址空间提供局部代表。

    -虚代理根据需要创建开销很大的对象。

    -保护代理控制对原始对象的访问。

    - 智能指引取代了简单的指针,它在访问对象的时候执行一些附加操作。

 

协作:

    代理根据其种类,在适当的时候向realSubject转发请求。

 

优点和缺点:

    1、Remote Proxy可以隐藏一个对象存在于不同地址空间的事实。

    2、Virtual Proxy可以进行最优化,例如根据要求创建对象。

    3、Protection Proxies和Smart Reference 都允许在访问一个对象的时候有一些附加的内务处理。

 

 

解决方案:

    

1、 模式的参与者

    1、Proxy

    -保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,Proxy会引用Subject。

    -提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。

    -控制对实体店存取,并可能负责创建和删除它。

    -其他功能依赖于代理的类型。

    2、Subject

    -定义RealSubject和Proxy 的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。

    3、RealSubject

     -定义Proxy所代表的实体。

2.实现方式

    java中一般三种代理模式:静态代理、动态代理、Cglib代理。

静态代理:

public interface Subject {
   
    public void request();
}

 

public class ConcreteSubject implements Subject {
   
    @Override
    public void request() {
       
    }
}
public class Proxy implements Subject {

    private Subject subject = null;

    public Proxy() {
        this.subject = new Proxy();
    }

    public Proxy(Subject subject) {
        this.subject = subject;
    }

    @Override
    public void request() {
        this.before();
        this.subject.request();
        this.after();
    }

    private void before() {
        //do something
    }

    private void after() {
        //do something
    }
}

 

动态代理

 

class MyInvocationHandle implements InvocationHandler{
    private Object target;
    public void setTarget(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //do something
            method.invoke(target, args);
            //do something
            return null;
    }
}

 

   Cglib代理

public class MyMethodInterceptor implements MethodInterceptor{

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        Object object = proxy.invokeSuper(obj, args);
        return object;
    }  
}

 

 

参考资料

《设计模式:可复用面向对象软件的基础》

CGLib动态代理

posted @ 2020-06-22 19:03  diameter  阅读(123)  评论(0编辑  收藏  举报