设计模式之代理模式
定义
为其他对象提供一个代理以控制对这个对象的访问
使用场景
-
当被访问的对象不想暴露全部内容时,可以通过代理去掉被访问的内容。
-
当一个对象不能或不想直接访问另一个对象时,可以通过一个代理间接的访问。为保证客户端的使用的透明性,委托对象和代理对象要实现同样的接口。
UML
-
Subject
抽象主题接口,定义了真实主题类和代理主题类公共的接口方法
-
RealSubject
真实主题类,代表真实对象,执行具体的业务逻辑。客户端通过代理间接的访问这个真实主题中方法。
-
ProxySubject
代理主题类。持有真实主题类的引用,在接口方法中调用真实主题类的相关方法,达到代理的作用。
代理之静态代理
-
抽象主题类 定义了委托对象和代理对象共同的接口方法
public interface Subject { void sumbit(); void burden(); void defend(); void finish(); }
-
真实主题类 实现真正业务逻辑,便于客户端通过代理类间接进行访问
public class RealSubject implements Subject { private static final String TAG = "RealSubject"; @Override public void sumbit() { Log.i(TAG,"起诉"); } @Override public void burden() { Log.i(TAG,"举证"); } @Override public void defend() { Log.i(TAG,"辩护 "); } @Override public void finish() { Log.i(TAG,"胜诉"); } }
-
代理主题类 持有委托对象的引用,在相应的接口方法中调用委托对象的方法
public class ProxySubject implements Subject { private Subject mILawsuit; public ProxySubject(Subject mILawsuit) { this.mILawsuit = mILawsuit; } @Override public void sumbit() { mILawsuit.sumbit(); } @Override public void burden() { mILawsuit.burden(); } @Override public void defend() { mILawsuit.defend(); } @Override public void finish() { mILawsuit.finish(); } }
-
-
客户端实现
RealSubject mCivilian=new RealSubject(); ProxySubject proxy=new ProxySubject(mCivilian); Log.i(TAG,"----------------------------静态代理-----------------"); proxy.sumbit(); proxy.burden(); proxy.defend(); proxy.finish(); Log.i(TAG,"----------------------------静态代理-----------------");
代理之动态代理 通过反射动态的生成代理者对象
-
抽象主题类 定义了委托对象和代理对象共同的接口方法
public interface Subject { void sumbit(); void burden(); void defend(); void finish(); }
-
真实主题类 实现真正业务逻辑,便于客户端通过代理类间接进行访问
public class RealSubject implements Subject { private static final String TAG = "RealSubject"; @Override public void sumbit() { Log.i(TAG,"起诉"); } @Override public void burden() { Log.i(TAG,"举证"); } @Override public void defend() { Log.i(TAG,"辩护 "); } @Override public void finish() { Log.i(TAG,"胜诉"); } }
-
动态代理生成类
public class DynamicProxySubject implements InvocationHandler { private Object mObject; public DynamicProxySubject(Object mObject) { this.mObject = mObject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //当然这里可以对方法名进行判断过滤 if(method.getName().equals("***")) Object result= method.invoke(mObject,args); return result; } }