概念

代理模式(Proxy Pattern)是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。在代理模式中,一个类代表另一个类的功能,我们创建具有现有对象的对象,以便向外界提供功能接口。

目的

  • 控制访问:为其他对象提供一种代理以控制对这个对象的访问。
  • 功能增强:完成目标对象的调用时,可附加一些额外功能。

问题

为什么要控制对于某个对象的访问呢? 举个例子: 有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需要使用它, 并非总是需要。

解决方法

增加中间层,关键代码实现与被代理类组合。

新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。 代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。

实际应用

1、Windows 里面的快捷方式,连接到真正应用程序。

2、买车不是直接去造车厂而是4s店。

3、spring aop(面向切片编程)。

具体例子:

信用卡是银行账户的代理,银行账户则是一大捆现金的代理。 它们都实现了同样的接口,均可用于进行支付。消费者会非常满意,因为不必随身携带大量现金;商店老板同样会十分高兴,因为交易收入能以电子化的方式进入商店的银行账户中,无需担心存款时出现现金丢失或被抢劫的情况。

实现方式

1、静态代理

案例实现步骤

(1)创建一个接口,定义卖u盘的方法。

public interface UsbSell {// 厂家和商家都要实现的功能(卖U盘)float sell(int amount);
}

(2)创建工厂类

// 厂家不接受用户的单独购买,需要商家代理销售
public class UsbFactory implements UsbSell {@Overridepublic float sell(int amount) {return 85.0f * amount;  // 出厂价}
}

(3)创建商家类(代理类)

public class TaoBao implements UsbSell {// 声明商家代理的具体是哪个厂家private UsbSell factory = new UsbFactory();@Overridepublic float sell(int amount) {float price = factory.sell(amount);float finalPrice = price + 25; // 功能增强System.out.println("某宝返还您5元优惠券!!!");return finalPrice;  // 售价}
}

改价格操作是不能被消费者访问和使用的,作用对象只能是商家(微商、实体商店等)。

(4)创建测试类(普通消费者)

public class shopMain {public static void main(String[] args) {TaoBao tb = new TaoBao();float pay = tb.sell(3);System.out.println("您购买的U盘,淘宝售价: "+ pay + '元');}
}

输出结果:

3x 85+25 = 280,验算后无误。

缺点

  • 当目标类增多了,代理类也需要增加(例如:上例中创建了一个工厂类,那么该类只能代表一个品牌工厂,当建立了其它品牌的工厂后,还需要为该工厂创建代理类)。
  • 当接口的方法增加或修改的时候,很多类都需要修改。

(2)动态代理

含义:​ 依靠jdk的反射机制,创建对象的能力,创建的是代理类的对象,不需要我们创建代理类。

动态代理会在jdk运行期间,动态创建class字节码并加载到JVM内存中。实现方式常用的有两种:使用JDK代理,与通过CGLlB动态代理。

JDK代理实现

这部分需理解 java反射包中的类和接口实现动态代理的功能,反射包java.lang.reflect里有三个类:InvocationHandler、Method、Proxy。

  • InvocationHandler接口:表示代理要干什么(定义目标类要完成的功能)。
  • method:目标类中的方法,jdk负责提供method对象。
  • proxy:使用Proxy类的静态方法,来创建代理对象,并把返回值转换为接口类型。

(1)创建接口

public interface UsbSell {float sell(int amount);
}

(2)创建工厂类(目标类)

public class UsbFactory implements UsbSell {@Overridepublic float sell(int amount) {return 85.0f * amount;  // 出厂价}
}

(3)创建InvocationHandler接口的实现类

//必须实现InvocationHandler接口,完成代理类的功能(调用目标方法、功能增强)
public class MySellHandler implements InvocationHandler {private  Object target = null;//动态代理的目标对象是动态传入的,传谁就给谁创建代理public MySellHandler(Object target){this.target = target;}//args代表接口中sell方法的参数@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object res = null;res = method.invoke(target,args);if(res!=null){Float price = (Float)res;price = price+25;res = price;}System.out.println("某宝返还您5元优惠券!!!");return res;}
}

(4)编写测试类

public class Test {public static void main(String[] args) {//创建目标对象UsbSell usbFactory = new UsbFactory();//创建invocationHandler对象InvocationHandler invocationHandler = new MySellHandler(usbFactory);//创建代理对象UsbSell proxy= (UsbSell) Proxy.newProxyInstance(usbFactory.getClass().getClassLoader(),usbFactory.getClass().getInterfaces(),invocationHandler);System.out.println("您购买的U盘,淘宝售价:"+ proxy.sell(100) + '元');}
}

输出结果:

与静态代理不同的是,我们不再需要每个工厂的具体实现类(如TaoBao.java) 。添加方法时,只需修改接口和目标类两个文件,客户类(Test.java)使用Proxy对象调用即可。注意jdk的动态代理必须有接口,目标类一定要实现该接口。

参考:设计模式(代理模式) |  代理设计模式

【java】代理模式简单实现相关推荐

  1. java代理模式_Java代理

    java代理模式 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指导您 ...

  2. java代理模式(java代理模式和适配器模式)

    Java设计模式的中介者模式是怎样的? 如果对象之间的关系原本一目了然,中介对象的加入便是"画蛇添足". 来看下中介者模式的组成部分吧. 1) 抽象中介者(Mediator)角色: ...

  3. java代理模式总结

    Java代理模式根据代理类生成时间的不同,可以分为静态代理和动态代理,它如同中介机构,可以为目标类提供代理服务,以控制对对象的访问,目标类的任何方法在执行前都必须经过代理类,这样代理类就可以用来负责请 ...

  4. 浅谈自己对Java代理模式的理解--即为什么要用怎么用

    首先,国际惯例,上Java代理模式的定义:  Java代理模式:对其他对象提供一种代理以控制对这个对象的访问.              定义很简单,就一句话,怎么去理解,不急,先听一个小故事: 故事 ...

  5. Java代理模式汇编

    文章目录 Java 代理模式实现方式,主流如下五种方法 Notes 静态代理实现 实现步骤 Cat接口 委托类 Lion 代理类角色(FeederProxy) 静态代理类测试 动态代理类(基于接口实现 ...

  6. 【重铸Java根基】理解Java代理模式机制

    最近带应届新员工,教然后知不足,发现自己把很多基础知识已经还给了大学老师,因此开贴,温故而知新! 从最基础的Java知识开始由浅入深,在某个知识点中遇到有疑惑的点会额外多写几句或者单独开帖子展开. ​ ...

  7. java代理模式实现

    java代理模式实现 @(代理模式)[静态代理,动态代理,InvocationHandler] java的代理模式 分为两种,静态代理和动态代理,学习下什么是代理和静态动态代理的作用. java代理模 ...

  8. [Java] 代理模式 Proxy Mode

    [Java] 代理模式 Proxy Mode 文章目录 [Java] 代理模式 Proxy Mode 1. 代理思想 2.java.lang.reflect.Proxy类 2.1 利用反射创建prox ...

  9. 阿里十年资深程序员吐血总结之Java代理模式

    阿里十年资深程序员吐血总结之Java代理模式 文章目录 阿里十年资深程序员吐血总结之Java代理模式 1.接口代理 2.类代理 3.动态代理都是通过反射实现的吗 4.jdk动态代理和cglib动态代理 ...

最新文章

  1. python 多线程日志切割+日志分析
  2. [WPF疑难]避免窗口最大化时遮盖任务栏
  3. springMVC4(9)属性编辑器剖析入参类型转换原理
  4. Leaflet中原生方式实现测距
  5. 接口文档生成工具Swagger2的使用
  6. 拓端tecdat|R语言中实现层次聚类模型
  7. 【控制】《最优控制理论与系统》-胡寿松老师-第4章-动态规划
  8. 数据挖掘概念与技术(原书第三版)范明 孟小峰译-----第二章课后习题答案
  9. html 字体设置草体,CSS 网页安全字体
  10. 考研:无穷小微积分的不适症
  11. 软件版本中的release,stable,alpha,beta,pre,snapshot
  12. 最新版MySQL 8.0.22(Windows 64位)下载安装详细方法
  13. ceph osd 磁盘损坏处理
  14. 网络挖掘初探索(2)_NEO4J图可视化
  15. row_number()的使用
  16. Python骚操作 | 还原已撤回的微信消息
  17. 腾讯网页登陆的加密机制
  18. 实战大项目:模拟登录丁香园,并抓取论坛页面所有的人员基本信息与回复帖子内容----爬取第二步
  19. SVN提交代码时全选文件
  20. 建设工程法规专科【7】

热门文章

  1. 阿里云表格存储使用教程
  2. 【日常吐槽 · 第六期】安卓模拟器充当真机调试
  3. 动态规划一:动态规划算法如何设计
  4. numpy的dtype,astype
  5. NI-6221 pwm相关函数
  6. indemind imsee 双目视觉惯性相机 SDK安装
  7. NodeJs之crypto
  8. 中小学计算机网络教室系统部署设计
  9. 日语音频转文字怎么做?有什么软件分享的吗
  10. C语言编程>第二周 ⑧ 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x……