设计模式02-动态代理模式
上一篇博客,我们以小明买雪碧为例介绍了代理模式(静态代理)的使用场景和代码实现
静态代理模式介绍
现在再来考虑以下假设的生活场景
小明
从楼下书店下单买书,书店再向印刷厂下单,积100分;
从楼下五金店下单买锤子,五金店再想机械厂下单,同样积100分;
...
此处省略n种类似场景
如果按照静态代理的方式,我们需要n个代理类,
会增加系统的复杂性和代码量,显然不够优雅。
这时轮到动态代理登场了,代码实现如下
1. 先定义ISeller接口
public interface ISeller {public void sell();
}
2. BookSeller、Hammer实现类
public class BookSeller implements ISeller {@Overridepublic void sell() {System.out.println("花三天从印刷厂买书");}
}public class HammerSeller implements ISeller {@Overridepublic void sell() {System.out.println("花三天从机械厂买锤子");}
}
3. 实现InvocationHandler
public class SellerInvocationHandler implements InvocationHandler {private Object target;public SellerInvocationHandler(Object target) {this.target = target;}@Overridepublic 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. 定义生产代理对象的动态工厂类
以上四步之后,就能用动态工厂类方法产生代理对象,并使用。
设计模式02-动态代理模式相关推荐
- 设计模式之动态代理模式实战
昨天分享了静态代理的概念及存在的缺点,所以今天讲的动态代理模式十分重要.动态代理在我们工作当中应用相当广泛,如Srping AOP就是动态代理的在开源框架的比较出名的应用. 动态代理有两种试,一是通过 ...
- 设计模式之动态代理模式
一.代理模式分为静态代理和动态代理 代理模式分为静态代理模式和静态代理模式,相对于静态代理模式,动态代理模式理解起来更加抽象. 二.想要了解动态代理模式首先要了解动态代理类 Java动态代理类位于Ja ...
- Java基础之02 动态代理模式172 173 类加载器原理分析
动态代理 所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect ...
- Android开发中无处不在的设计模式——动态代理模式
继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...
- 设计模式之代理模式、动态代理模式、Cglib代理模式
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的 ...
- 【设计模式】--- 装饰器模式、静态代理模式和动态代理模式
文章目录 1 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...
- 设计模式之----Java动态代理模式
在Spring中,有很多设计模式被应用,其中不乏代理模式.而代码模式中,就一定少不了动态代理模式.今天就对动态代理模式进行学习记录. 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托 ...
- 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式
大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...
- Java设计模式之JDK动态代理模式
先来谈谈什么动态代理模式,在一家软件公司,假如你是一个软件开发工程师.当客户带着需求去找公司的时候,显然不会直接让你和客户谈,肯定是先和商务经理,产品经理类的谈需求.因为客户的需求可能千奇百怪,很有可 ...
- 软件设计模式 | 动态代理模式
文章目录 一.动态代理概述 1.1 代理的概述和作用 1.2 动态代理的优点 1.3 代理对象的创建 1.4 代理对象调用方法的执行流程 二.动态代理举例 2.1 歌手经纪人 2.2 业务功能的性能统 ...
最新文章
- shufflenet-centernet
- 聊聊、Zookeeper 客户端 Curator
- Redis Desktop Manager 利用ssh连接 Redis
- python 套接字 struck_Python socket粘包问题(最终解决办法)
- docker安装nextcloud(附nextcloud win7客户端下载教程)
- flask gunicorn gevent部署
- 计算机固态硬盘与机械硬盘的区别是什么,电脑固态硬盘和机械硬盘有什么区别-电脑固态硬盘和机械硬盘区别介绍 - 系统家园...
- TL-WR720n 硬改 16M rom
- sqrt mysql_详解MySQL中的SQRT函数的使用方法_MySQL
- 一文读懂 HBase 使用场景
- Notepad JSON格式化
- BZOJ5294 BJOI2018 二进制 线段树
- 用Android 写生成的梅花
- SpringCloud(八) 微服务安全实战 Prometheus配置grafana可见性监控,ELK日志,pinpoint追踪(Tracing,Metrics,Logging)
- 静下来读《一个人的村庄》
- Android SDK包下载分享
- 关于文案、营销、生活的15条思考!
- psv登陆商店显示服务器,psv云服务器
- 微信小程序引入iconfont单色图标实例(Font class方式)
- MBA英文面试常用句式