proxy是代理人的意思,编程当中,指的是创建代理人和本人两个对象,只有代理人无法完成的工作才会交给本人完成。其他工作都由代理人自己完成。
subject角色定义了Proxy角色(代理人)和RealSubject角色(一致)接口。由于存在Subject接口(Proxy、RealSubject都为Subject接口的实现类),所以客户端角色不必在意使用的是proxy角色还是RealSubject角色。
public interface Printable {public abstract void setPrinterName(String name);public abstract String getPrinterName();public abstract void print(String printString);
}
proxy角色会尽量处理来自client角色的请求,只有当自己不能处理时,她才会将工作交给RealSubject角色。Proxy角色只有在必要时才会生成RealSubject角色。Proxy为Subject接口的实现类。
public class PrinterProxy implements Printable {private String printerName;// 被代理对象 Printerprivate Printer printer;public PrinterProxy() {}public PrinterProxy(String printerName) {this.printerName = printerName;}@Overridepublic synchronized void setPrinterName(String name) {if (printer != null) {printer.setPrinterName(name);}printerName = name;}@Overridepublic String getPrinterName() {return printerName;}@Overridepublic void print(String printString) {realize();printer.print(printString);}private synchronized void realize() {if (printer == null) {printer = new Printer();printer.setPrinterName(printerName);}}
}
RealSubject为Subject接口的实现类。只有Proxy处理不了任务时实现。
实际主体即printer在实例时需要比较长的时间,因此仅需要进行实例化的时候才对其进行实例化。即仅需要使用print功能的时候,才实例化printer。
public class Printer implements Printable {private static final String TAG = "JJWorld Printer";private String name;public Printer() {heavyJob( "printer实例生成中");}public Printer(String name) {this.name = name;heavyJob(name + "的printer实例生成中");}@Overridepublic void setPrinterName(String name) {this.name = name;}@Overridepublic String getPrinterName() {return name;}@Overridepublic void print(String printString) {Log.i(TAG,"************" + name + "************");Log.i(TAG,"************" + printString + "************");}private void heavyJob(String msg){Log.i(TAG,msg);for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);}catch (Exception e){}Log.i(TAG,".");}Log.i(TAG,"******************end******************");}
}
使用Proxy模式的角色。并不包含在Proxy中。
public class MainActivity extends Activity {private static final String TAG = "JJWorld MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {Printable printer = new PrinterProxy();printer.setPrinterName("虚空大帝");Log.i(TAG,printer.getPrinterName());printer.print("虚空一生不弱于人");printer.setPrinterName("无始大帝");Log.i(TAG,printer.getPrinterName());}}).start();}
}
程序执行之前编写好执行类的代理类。
在程序执行过程中,使用jdk的反射机制,创建代理类对象,并动态的制定要代理目标类。
通过反射自动生成代理对象。
通过重写invoke方法,当targetObj的方法执行前后,执行
Log.i(TAG,"开始执行");
Log.i(TAG,"结束执行");
打印日志操作。
public class DynamicProxy implements InvocationHandler {private static final String TAG = "JJWorld.DynamicProxy";private Object targetObj;@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Log.i(TAG,"开始执行");Object invoke = method.invoke(targetObj,args);Log.i(TAG,"结束执行");return invoke;}/*** 动态代理对象实例*/public Object getInstance(Object targetObj){this.targetObj = targetObj;return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),targetObj.getClass().getInterfaces(),this);}}
public class MainActivity extends Activity {private static final String TAG = "JJWorld MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {List dynamicProxyList = (List)new DynamicProxy().getInstance(new ArrayList());dynamicProxyList.add("hello world");}}).start();}
}
可见,在add方法的前后都加上了打印日志操作
2023-03-14 11:03:43.456 32540-332/cn.jj.project2 I/JJWorld.DynamicProxy: 开始执行
2023-03-14 11:03:43.456 32540-332/cn.jj.project2 I/JJWorld.DynamicProxy: 结束执行