什么时候需要用到代理模式
不希望与真实的对象进行交互,或者需要做一些额外的控制。因为是代理的关系,所以与代理对象交互的时候,就像与真实的对象交互一样。只是中间的代理类会做一些额外的操作。现有的代理模式中有静态代理和动态代理两种,静态代理就是在编译的时候代理的关系就已经确定了,而动态的代理是在运行的时候才有的代理关系。
先看静态代理
静态代理类图
类图主要反应两点
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下的内容.戳我查看详情