一、简述代理模式
为其它对象提供一种中间代理以控制对这个对象的访问。
核心目的:在真正需要的时候才去创建或者初始化某些开销很大的对象,以降低开销。
模式适用场景:
1.为一个对象在不同地址空间提供局部代表。
2.控制对原始对象的访问。
3.根据需要创建开销很大的对象。
4.需要在访问对象时执行一些附加操作。
二、GOF书本例子—文本编辑器中的image
1.例子说明:
在文本编辑器中,图像(Image)的创建和初始化一般会比文本耗费更多的资源,使用另一个对象。即图像Proxy(ImageProxy),来代替真正的图像,Proxy可以代替一个图像对象,并在需要时负责初始化这个图像对象。
代码总体调用关系如下图所示:
示例场景结构图:
代理模式主要参与者(请配合类图进行阅读):
1.代理Proxy(ImageProxy):控制对image对象的访问,并负责创建和删除它。
2.RealSubject(Image):真正的image对象
3.Subject(Graphic):提供一个统一的接口规范给RealSubject与Proxy。
类图如下图所示:
2.C++代码实现
代码执行结果:
代码执行结果分析:
初始化的时候默认值extent是888,但在调用Proxy的draw后,真正的Image对象被创建并初始化(extent的值为88),所以后面使用的都是Image对象。
总结
代理模式总结:
模式优点:
1、代理模式能将代理对象与真实被调用的目标对象分离。
2、一定程度上降低了系统的耦合度(Image底层和其业务Proxy分离),扩展性好。
3、可以起到保护目标对象的作用。
4、可以对目标对象的功能进行增强但又不会影响本身已有的代码(更新Image的应用部分功能,只需要修改Proxy不用每次都修改Image类)
模式缺点:
1、代理模式会造成系统设计中类的数量增加。
2、在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
3、相对增加了系统的复杂度。