Proxy是一种结构设计模型,主要解决对象直接访问带来的问题,代理又分为静态代理和动态代理(JDK代理、CGLIB代理。

静态代理:又程序创建的代理类,或者特定的工具类,在平时开发中经常用到这种代理模式,这种一般在程序运行前就已经生成对应的class文件;

动态代理:在程序运行时通过反射机制动态创建。

下面通过一个场景实现以下三种代理方式

  • 步骤一:定义商店接口(Subject)
  • 步骤二:个人店家运营(RealSubject)
  • 步骤三:平台运营(proxy)
  • 步骤四:个体消费(client)

几种代理方式都会用到Subject、RealSubject,现在这里定义

Store.java(Subject):定义两个接口operate(运营),business(交易)。

public interface Store { /** * 店铺运营 */ public void operate(); /** * 店铺交易 */ public void business();}

PersonStore.java(RealSubject) 单个用户运营

public class PersonStore implements Store { @Override public void operate() { System.out.println("个人商店运营"); } @Override public void business() { System.out.println("个人商店交易"); }}

静态代理

静态代理的实现比较简单,代理类通过实现与目标对象相同的接口,并在类中维护一个代理对象,这种场景用于个体商家比较少的情况,如果多的话代理类十分繁多、不易维护

创建静态代理类

ProxyStroe.java(proxy):在代理平台运营是收取管理费用100,这个代理类需要实现Store接口,并制定目标类target(PersonStore)。

public class ProxyStroe implements Store{ private Store personStore = new PersonStore(); @Override public void operate() { System.out.println("收取管理费用100元"); personStore.operate(); } @Override public void business() { personStore.business(); }}

静态代理调用

StaticConsumer.java(client):通过创建ProxyStroe去代理PersonStore,并进行操作。

public class StaticConsumer { public static void main(String[] args) { ProxyStroe store = new ProxyStroe(); store.operate(); store.business(); }}

动态代理

JDK代理

动态代理类是通过接口实现的,利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,

在调用具体方法前调用InvokeHandler来处理。

创建jdk代理类

JDKStoreHandler.java(proxy):通过实现InvocationHandler接口的invoke方法,在里面进行反射调用,newProxyInstanse通过目标对象创建真是对象。

public class JDKStoreHandler implements InvocationHandler { /** * 目标对象 */ private Object targetObject; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if("operate".equals(method.getName())){ System.out.println("收取管理费用100元"); } return method.invoke(targetObject, args); } /** * * @param targetObject * @return */ public Object newProxyInstanse(Object targetObject){ this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this); }}

JDK代理对象调用

JDKDynamicConsumer.java(proxy):通过JDKStoreHandler的newProxyInstanse创建真实目标对象,并调用接口的方法

public class JDKDynamicConsumer { public static void main(String[] args) { Store store = (Store)new JDKStoreHandler().newProxyInstanse(new PersonStore()); store.operate(); store.business(); }}

CGLIB代理

cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

创建cglib代理对象

CglibProxy.java(proxy):需要实现MethodInterceptor的intercept方法,并进行反射调用。通过createProxyObject创建真实对象,这里是根据目标对象直接生成对象。

public class CglibProxy implements MethodInterceptor{ /** * CGlib需要代理的目标对象 */ private Object targetObject; public Object createProxyObject(Object targetObject){ this.targetObject = targetObject; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(targetObject.getClass()); enhancer.setCallback(this); Object proxyObj = enhancer.create(); return proxyObj; } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { if("operate".equals(method.getName())){ System.out.println("收取管理费用100元"); } return method.invoke(targetObject, objects); }}

CGLib代理对象调用

CglibDynamicConsumer.java(client):通过CglibProxy的createProxyObject创建真实目标对象,对进行方法调用

public class CglibDynamicConsumer { public static void main(String[] args) { Store store = (Store)new CglibProxy().createProxyObject(new PersonStore()); store.operate(); store.business(); }}

proxy connect abort处理方法_Java代理设计模式(Proxy)的几种具体实现相关推荐

  1. proxy connect abort处理方法_Vue 3.0 初探 - Proxy

    前言 4 月 17 日,尤大在微博上宣布 Vue 3.0 beta 版本正式发布. 在尤大发布的< Vue3 设计过程>文章中提到之所以重构 Vue 一个考量就是JavaScript新的语 ...

  2. Java代理设计模式(Proxy)的具体实现:静态代理和动态代理

    Java代理设计模式(Proxy)的具体实现:静态代理和动态代理 实现方式一:静态代理 静态代理方式的优点 静态代理方式的缺点 Java动态代理实现方式一:InvocationHandler Java ...

  3. Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理

    面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问"茴香豆的茴字有哪几种写法?" 所谓代理模式,是指客户端(Cl ...

  4. 巧用代理设计模式(Proxy Design Pattern)改善前端图片加载体验

    这篇文章介绍一种使用代理设计模式(Proxy Design Pattern)的方法来改善您的前端应用里图片加载的体验. 假设我们的应用里需要显示一张尺寸很大的图片,位于远端服务器.我们用一些前端框架的 ...

  5. java多线程同步的四种方法_java中实现多线程的两种方法

    java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...

  6. java json的使用方法_JAVA编写JSON常用的三种方法

    JAVA编写JSON常用的三种方法 Szx • 2019 年 11 月 15 日 1.jsonlib需要引入的包也多,代码也相对多一些. 2.Gson:谷歌的 3.FastJson:阿里巴巴的,这几个 ...

  7. java中三种方法_Java文件I/O的三种方法

    Java文件I/O的三种方法 RandomAccessFile是不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和DataOutput接口之外(Data ...

  8. java 终止方法_Java中终止线程的三种方法

    Java中终止线程的三种方法 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经 ...

  9. java里break的使用方法_Java中break的第三种用法说明

    在Java中,break语句有三种用法,第一种是用于终止switch语句中的语句序列,第二种是用于退出循环,然而第三种是用作goto语句的"文明"形式! 我们知道,goto语句会破 ...

最新文章

  1. 【算法笔记】二分图最大权匹配 - KM算法(dfs版O(n4) + bfs版O(n3))
  2. 中国 AI 出海,大华等企业助力联合国制定面部识别标准
  3. python人工智能入门书籍推荐-小编就给大家推荐几本python机器学习入门书!
  4. C++反转字符串的算法(附完整源码)
  5. moel vue 自定义v_vue在自定义组件中使用v-model的方法
  6. postman安装路径_Newman进行postman脚本自动化
  7. 用命令来操作vSphere:十一 PowerCLI命令--虚拟机操作
  8. Web后端的基础知识
  9. 管家婆登录服务器未响应,管家婆辉煌登录点击下一步没有反应解决办法
  10. 卡通漫画Photobacks Cartoon 2.0 PS扩展面板汉化版 支持CC2019
  11. AfterEffects 不支持 MKV 格式的解决办法
  12. SPSS19.0实战之聚类分析(转载)
  13. 三菱伺服电机马达使用注意事项
  14. Webpack(上)
  15. 2000 Followers-3D CSS text
  16. ios开发工具_7个基本的ios开发人员工具
  17. 解决Kafka消费端错误:o.s.kafka.listener.LoggingErrorHandler : Error while processing: null
  18. 690. Employee Importance
  19. 人大金仓数据Windows安装教程
  20. 快速入门:BUMO 节点安装运维指南

热门文章

  1. 《乌合之众》读书笔记(part3)--在群体当中,个人的利益极少会成为强大的动因
  2. 初识Mysql(part8)--我需要知道的5个关于计算字段的小知识
  3. 我的世界服务器破坏方块有延迟,问一下我的世界游戏方块不会被破坏的指令以及指令适用于游戏的版本 我记得在服务器上和单机上好像有不同的指令...
  4. mysql 数据库 额外_mysql – 拥有“额外”数据库查询有多糟糕?
  5. abcde依次进入一个队列_详解队列队形及口令(新教师必看)
  6. 这个神奇的库,可以将数据平滑化并找到异常点
  7. HTTP 头部字段 Cache Control max-age = 0 和 no-cache 的区别
  8. SAP HANA Cloud 简介
  9. TypeScript 的命名空间 namespace
  10. occ-backend-base-url 的相关代码,如何调试?