我眼中的代理模式

来源:互联网 发布:手机联机软件 编辑:程序博客网 时间:2024/05/22 15:34

什么时候需要用到代理模式

不希望与真实的对象进行交互,或者需要做一些额外的控制。因为是代理的关系,所以与代理对象交互的时候,就像与真实的对象交互一样。只是中间的代理类会做一些额外的操作。现有的代理模式中有静态代理和动态代理两种,静态代理就是在编译的时候代理的关系就已经确定了,而动态的代理是在运行的时候才有的代理关系。

先看静态代理

静态代理类图

类图主要反应两点
1.代理类和被代理类对外界是无法区分的,好像是一样的。这样代理类和被代理类就继承与一个接口
2.代理类是对真实的类加了一层,这就需要代理类持有被代理类。代理类组合被代理类

静态代理

代码

//公共接口public interface Print {    public void print(String str);}//真实的类public class RealPrint implements Print{    @Override    public void print(String str) {        // TODO Auto-generated method stub       Log.d(str);    }}

静态代理 代码

public class ProxyPrint implements Print {    private RealPrint mMyprint;     public ProxyPrint(RealPrint myPrint){        mMyprint = myPrint;    }    @Override    public void print(String str) {        // TODO Auto-generated method stub        Log.d("静态代理前 str : "+str);        //在这里可以做很多操作:比如对传递的数据进行检验,加工处理,这里模拟字符串变小写        str = str.toLowerCase();        mMyprint.print(str);    }}

动态代理 代码

动态代理的类图就略过了,没啥好看的,其本质就是反射的方式取调用,在调用之前可以允许你做一些额外的事情。动态代理的好处是,在运行时代理,代理一堆的同一个接口的类,也只需要一个代理类,少了手动创建代理的过程。直接上代码

public class DynamicProxyHandler implements InvocationHandler{    private Print mRealPrint;    public  DynamicProxyHandler(Print realPrint) {        mRealPrint = realPrint;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        // TODO Auto-generated method stub        beforeOperation();        method.invoke(mRealPrint, args);        return null;    }    private void beforeOperation() {        Log.d("\n我是动态代理前面的操作");    }}

为了更好的查看,以代码的方式进行了记录.详情请查看DesignPattern中的 com.arron.pattern.proxy下的内容.戳我查看详情

原创粉丝点击