设计模式-12 代理模式
来源:互联网 发布:淘宝助理怎么使用5.5 编辑:程序博客网 时间:2024/05/17 05:17
1 静态代理
主题接口
public interface Subject { void request();}
真正的主题对象
public class RealSubject implements Subject{ public void request() { System.out.println("request() 真正的角色"); }}
代理对象
public class ProxyObject implements Subject { /** * 真实对象 */ private Subject subject; public ProxyObject(Subject subject){ this.subject = subject; } public void request() { System.out.println("ProxyObject begin"); subject.request(); System.out.println("ProxyObject finish"); }}
Client
public class Test { public static void main(String[] args) { Subject subject = new RealSubject(); ProxyObject proxy = new ProxyObject(subject); proxy.request(); }}
打印结果
ProxyObject beginrequest() 真正的角色ProxyObject finish
代理对象中持有一个主题接口的对象。当调用代理对象的request()方法时将会使用主题对象调用主题对象的方法。
2 动态代理
主题
public interface Subject { void request();}
主题实现类
public class RealSubject implements Subject{ public void request() { System.out.println("request() 真正的角色"); }}
代理者
public class MyIncationHandler implements InvocationHandler{ private Object mTarget; public MyIncationHandler(Object object){ this.mTarget = object; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("MyIncationHandler before"); Object result = method.invoke(mTarget, args); System.out.println("MyIncationHandler finish"); return result; }}
public class Test { public static void main(String[] args) { Subject subject = new RealSubject(); /** * 第一个参数 classLoader contextLoader * 第二个参数 接口参数 决定返回的对象实现了哪些接口 * 第三个参数 myIncationHandler 代理时 需要处理具体的接口 */ MyIncationHandler myIncationHandler = new MyIncationHandler(subject); Subject proxy = (Subject) Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), subject.getClass().getInterfaces(), myIncationHandler); proxy.request(); }}
运行结果
MyIncationHandler beforerequest() 真正的角色MyIncationHandler finish
使用代理调用接口里的方法
proxy.request();
最终会回调到实现类的方法,从打印结果可以得出该结论。
并且代理对象中invoke()方法的这一行表示用实现类去反射射调用实现类的方法。
Object result = method.invoke(mTarget, args);
使用动态代理的几个步骤:
1 创建接口,并创建该接口的实现类。
2 创建代理对象实现并实现InvocationHandler接口。在抽象方法中反射调用方法。
3 初始化代理对象
Subject proxy = (Subject) Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), subject.getClass().getInterfaces(), myIncationHandler);
4 用代理对象去调用接口的方法。
proxy.request();
阅读全文
0 0
- 设计模式-12 代理模式
- 设计模式--【代理模式】
- 设计模式:代理模式
- 设计模式--代理模式
- 设计模式---代理模式
- 设计模式-代理模式
- 设计模式---代理模式
- 设计模式 代理模式
- 设计模式-【代理模式】
- 设计模式-代理模式
- 设计模式----代理模式
- 设计模式-代理模式
- 设计模式---代理模式
- 设计模式--代理模式
- 设计模式-代理模式
- 设计模式- 代理模式
- 设计模式---代理模式
- 设计模式 - 代理模式
- Js 对小数的处理(科学计数法 , 显示精度)
- Unity与VS关联
- 高中逍遥游快速记忆
- 微信分享实践和踩坑实践
- [绍棠_Swift] Swift3.0中Get、Post的同步与异步请求
- 设计模式-12 代理模式
- 欢迎使用CSDN-markdown编辑器
- 面向对象 练习题4
- POJ 2349 Arctic Network
- android 控件背景设置渐变色
- 用智能音箱+AI 联网玩狼人杀将是怎样的体验?
- 电脑重启后nagios报错Unable to get process status
- C++类与对象
- ue4 fatal error LNK1181 Engine\Binaries\Win64\UE4-UMGEditor.lib