1.定义
给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
- 代理对象:起到中介作用,连接客户端和目标对象
- 例子:电脑桌面的快捷方式。电脑对某个程序提供一个快捷方式(代理对象),快捷方式连接客户端和程序,客户端通过操作快捷方式就可以操作那个程序
2.实例概况
- 背景:小成希望买一台最新的顶配Mac电脑
- 冲突:国内还没上,只有美国才有
- 解决方案:寻找代购进行购买
代购(代理对象) 代替 我(真实对象) 去买Mac(间接访问的操作)
使用步骤
步骤1: 创建抽象对象接口(Subject):声明你(真实对象)需要让代购(代理对象)帮忙做的事(买Mac)
1 public interface Subject { 2 public void buyMac(); 3 }
步骤2: 创建真实对象类(RealSubject),即”我“
1 public class RealSubject implement Subject{ 2 @Override 3 public void buyMac() { 4 System.out.println(”买一台Mac“); 5 } 6 }
步骤3:创建代理对象类(Proxy),即”代购“,并通过代理类创建真实对象实例并访问其方法
1 public class Proxy implements Subject{ 2 3 @Override 4 public void buyMac{ 5 6 //引用并创建真实对象实例,即”我“ 7 RealSubject realSubject = new RealSubject(); 8 9 //调用真实对象的方法,进行代理购买Mac 10 realSubject.buyMac(); 11 //代理对象额外做的操作 12 this.WrapMac(); 13 } 14 15 public void WrapMac(){ 16 System.out.println(”用盒子包装好Mac“); 17 } 18 }
步骤4:客户端调用
1 public class ProxyPattern { 2 3 public static void main(String[] args){ 4 5 Subject proxy = new Proxy(); 6 proxy.buyMac(); 7 } 8 9 }
结果输出
买一台Mac
用盒子包装好Mac
通过上述这个常见的生活例子,我相信你已经完全明白了代理模式的原理了!!
3. 优缺点
在全面解析完代理模式后,我来分析下其优缺点:
3.1 优点
- 协调调用者和被调用者,降低了系统的耦合度
- 代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用
3.2 缺点
- 由于在客户端和真实主题之间增加了代理对象,因此会造成请求的处理速度变慢;
- 实现代理模式需要额外的工作(有些代理模式的实现非常复杂),从而增加了系统实现的复杂度。
4. 应用场景
![](http://upload-images.jianshu.io/upload_images/944365-6ab7f58ee0497fdd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/740/format/webp)
示意图