1、
意图:为其他对象提供一种代理以控制对这个对象的访问。
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
何时使用:想在访问一个类时做一些控制。
作用:1、功能增强 2、控制访问。
如何解决:增加中间层。
关键代码:实现与被代理类组合。
应用实例 :1、Windows 里面的快捷方式。2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。3、买火车票不一定在火车站买,也可以去代售点。4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。5、spring aop。
优点 :1、职责清晰。2、高扩展性。3、智能化。
缺点:1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
使用场景:按职责来划分,通常有以下使用场景:1、远程代理。2、虚拟代理。3、Copy-on-Write 代理。4、保护(Protect or Access)代理。5、Cache代理。6、防火墙(Firewall)代理。7、同步化(Synchronization)代理。8、智能引用(Smart Reference)代理。
注意事项:1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
实例:
1、创建父接口
package com.example.test.design.代理模式; public interface 拔牙接口 { void 拔牙(); }
2、创建被代理接口
package com.example.test.design.代理模式; /** * @description: * @author: lcj * @time: 2021/9/11 17:37 */ public class 拔牙实现 implements 拔牙接口 { String 步骤1; String 步骤2; String 步骤3; String 拔牙; public void 洗牙() { this.步骤1 = "已经完成洗牙"; } public void 消毒() { this.步骤2 = "已经完成消毒"; } public void 心理询问() { this.步骤3 = "已经完成心理询问"; } @Override public void 拔牙() { this.拔牙 = "已经完成拔牙"; System.out.println(this.toString()); } @Override public String toString() { return "拔牙实现{" + "步骤1='" + 步骤1 + '\'' + ", 步骤2='" + 步骤2 + '\'' + ", 步骤3='" + 步骤3 + '\'' + ", 拔牙='" + 拔牙 + '\'' + '}'; } }
3、创建代理接口
package com.example.test.design.代理模式; /** * @description: * @author: lcj * @time: 2021/9/11 17:38 */ public class 医生代理我拔牙 implements 拔牙接口{ @Override public void 拔牙(){ 拔牙实现 拔牙实现 = new 拔牙实现(); 拔牙实现.洗牙(); 拔牙实现.消毒(); 拔牙实现.心理询问(); 拔牙实现.拔牙(); } }
4、测试
package com.example.test.design.代理模式; /** * @description: * @author: lcj * @time: 2021/9/11 17:51 */ public class 代理模式测试 { public static void main(String[] args) { //自己拔牙 拔牙实现 拔牙实现 = new 拔牙实现(); 拔牙实现.拔牙(); //医生拔牙 医生代理我拔牙 医生代理我拔牙 = new 医生代理我拔牙(); 医生代理我拔牙.拔牙(); } }
5、输出结果
拔牙实现{步骤1='null', 步骤2='null', 步骤3='null', 拔牙='已经完成拔牙'}
拔牙实现{步骤1='已经完成洗牙', 步骤2='已经完成消毒', 步骤3='已经完成心理询问', 拔牙='已经完成拔牙'}
浙公网安备 33010602011771号