上一篇博客,我们以小明买雪碧为例介绍了代理模式(静态代理)的使用场景和代码实现
静态代理模式介绍

现在再来考虑以下假设的生活场景

小明
从楼下书店下单买书,书店再向印刷厂下单,积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-动态代理模式相关推荐

  1. 设计模式之动态代理模式实战

    昨天分享了静态代理的概念及存在的缺点,所以今天讲的动态代理模式十分重要.动态代理在我们工作当中应用相当广泛,如Srping AOP就是动态代理的在开源框架的比较出名的应用. 动态代理有两种试,一是通过 ...

  2. 设计模式之动态代理模式

    一.代理模式分为静态代理和动态代理 代理模式分为静态代理模式和静态代理模式,相对于静态代理模式,动态代理模式理解起来更加抽象. 二.想要了解动态代理模式首先要了解动态代理类 Java动态代理类位于Ja ...

  3. Java基础之02 动态代理模式172 173 类加载器原理分析

    动态代理 所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect ...

  4. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  5. 设计模式之代理模式、动态代理模式、Cglib代理模式

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的 ...

  6. 【设计模式】--- 装饰器模式、静态代理模式和动态代理模式

    文章目录 1 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...

  7. 设计模式之----Java动态代理模式

    在Spring中,有很多设计模式被应用,其中不乏代理模式.而代码模式中,就一定少不了动态代理模式.今天就对动态代理模式进行学习记录. 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托 ...

  8. 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...

  9. Java设计模式之JDK动态代理模式

    先来谈谈什么动态代理模式,在一家软件公司,假如你是一个软件开发工程师.当客户带着需求去找公司的时候,显然不会直接让你和客户谈,肯定是先和商务经理,产品经理类的谈需求.因为客户的需求可能千奇百怪,很有可 ...

  10. 软件设计模式 | 动态代理模式

    文章目录 一.动态代理概述 1.1 代理的概述和作用 1.2 动态代理的优点 1.3 代理对象的创建 1.4 代理对象调用方法的执行流程 二.动态代理举例 2.1 歌手经纪人 2.2 业务功能的性能统 ...

最新文章

  1. shufflenet-centernet
  2. 聊聊、Zookeeper 客户端 Curator
  3. Redis Desktop Manager 利用ssh连接 Redis
  4. python 套接字 struck_Python socket粘包问题(最终解决办法)
  5. docker安装nextcloud(附nextcloud win7客户端下载教程)
  6. flask gunicorn gevent部署
  7. 计算机固态硬盘与机械硬盘的区别是什么,电脑固态硬盘和机械硬盘有什么区别-电脑固态硬盘和机械硬盘区别介绍 - 系统家园...
  8. TL-WR720n 硬改 16M rom
  9. sqrt mysql_详解MySQL中的SQRT函数的使用方法_MySQL
  10. 一文读懂 HBase 使用场景
  11. Notepad JSON格式化
  12. BZOJ5294 BJOI2018 二进制 线段树
  13. 用Android 写生成的梅花
  14. SpringCloud(八) 微服务安全实战 Prometheus配置grafana可见性监控,ELK日志,pinpoint追踪(Tracing,Metrics,Logging)
  15. 静下来读《一个人的村庄》
  16. Android SDK包下载分享
  17. 关于文案、营销、生活的15条思考!
  18. psv登陆商店显示服务器,psv云服务器
  19. 微信小程序引入iconfont单色图标实例(Font class方式)
  20. MBA英文面试常用句式

热门文章

  1. cocoa pods
  2. Anaconda环境GDAL库基于whl文件的配置方法
  3. 文件比对工具对比两种数据的差距
  4. poj1094 Sorting It All Out(拓扑排序+传递闭包)
  5. Arduino 使用火焰传感器检测火焰实验
  6. AirDisk产品Q3C体验
  7. c语言count函数的作用,count通达信什么意思,count是啥意思
  8. Tomcat修改内存
  9. 实战三十三:STAMP算法实现商品推荐实战 代码+数据
  10. C++轻量级跨平台桌面GUI库FLTK的简单使用