设计模式02-动态代理模式
2017-10-28 13:45
393 查看
上一篇博客,我们以小明买雪碧为例介绍了代理模式(静态代理)的使用场景和代码实现
静态代理模式介绍
现在再来考虑以下假设的生活场景
如果按照静态代理的方式,我们需要n个代理类,
会增加系统的复杂性和代码量,显然不够优雅。
这时轮到动态代理登场了,代码实现如下
测试结果如下:
1. 定义被代理对象的接口、方法
2. 定义被代理对象的实现类
3. 定义实现InvocationHandler的实现类
4. 定义生产代理对象的动态工厂类
以上四步之后,就能用动态工厂类方法产生代理对象,并使用。
静态代理模式介绍
现在再来考虑以下假设的生活场景
小明 从楼下书店下单买书,书店再向印刷厂下单,积100分; 从楼下五金店下单买锤子,五金店再想机械厂下单,同样积100分; ... 此处省略n种类似场景
如果按照静态代理的方式,我们需要n个代理类,
会增加系统的复杂性和代码量,显然不够优雅。
这时轮到动态代理登场了,代码实现如下
1. 先定义ISeller接口
public interface ISeller { public void sell(); }
2. BookSeller、Hammer实现类
public class BookSeller implements ISeller { @Override public void sell() { System.out.println("花三天从印刷厂买书"); } } public class HammerSeller implements ISeller { @Override public void sell() { System.out.println("花三天从机械厂买锤子"); } }
3. 实现InvocationHandler
public class SellerInvocationHandler implements InvocationHandler { private Object target; public SellerInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(target,args); System.out.println("动态代理--积100分"); return result; } }
4.动态代理对象工程类DynamicSellerProxyFactory
public class DynamicSellerProxyFactory { public static ISeller getProxy(ISeller seller){ SellerInvocationHandler sh = new SellerInvocationHandler(seller); ISeller bs = (ISeller) Proxy.newProxyInstance(Client.class.getClassLoader(), BookSeller.class.getInterfaces(), sh); return bs; } }
5.客户端测试程序
public class Client { public static void main(String[] args) { /** * 得到BookSeller的代理 */ ISeller seller = DynamicSellerProxyFactory.getProxy(new BookSeller()); seller.sell(); System.out.println("*************分界线*****************"); /** * 得到HammerSeller的代理 * 不用新增代理类 */ seller = DynamicSellerProxyFactory.getProxy(new HammerSeller()); seller.sell(); } }
测试结果如下:
总结
示例代码为Java JDK原生支持的动态代理实现,分成四步1. 定义被代理对象的接口、方法
2. 定义被代理对象的实现类
3. 定义实现InvocationHandler的实现类
4. 定义生产代理对象的动态工厂类
以上四步之后,就能用动态工厂类方法产生代理对象,并使用。
相关文章推荐
- 【设计模式】动态代理Proxy_02
- 设计模式 --代理模式--动态代理
- 【设计模式之二:代理模式】代理模式(静态代理VS动态代理)
- 设计模式_25:动态代理模式
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- Android设计模式之动态代理,实现方法拦截功能
- 代理设计模式(普通静态代理、JDK动态代理、cglib动态代理)
- 设计模式学习之代理模式(二)--CGLIB实现对Class动态代理
- 【java设计模式:动态代理】
- 设计模式之JDK动态代理和Cglib动态代理
- Java设计模式Proxy之动态代理
- 设计模式之动态代理
- 设计模式——代理模式(静态代理和JDK、CGLib动态代理)
- 设计模式真的完美无缺吗?代理模式重磅升级版----动态代理
- 设计模式——之动态代理 笔记
- 设计模式中的代理模式与Java中的动态代理
- 23个设计模式之代理模式(2)动态代理
- GOF23设计模式之动态代理模式实现之经典
- Java设计模式之 静态代理和动态代理
- 动态代理(JAVA设计模式)