我眼中的代理模式

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

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

先看静态代理

静态代理类图

类图主要反应两点
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下的内容.戳我查看详情

猜你喜欢

转载自blog.csdn.net/xjz729827161/article/details/78229781