解读设计模式----代理模式(Proxy Pattern),从买电脑的那些事儿说起
一、说买电脑的那些事
我之前一直用的是台式机,可总感觉不方便,特别是携带,就拿租房子后搬家来说吧,费了不少劲。种种原因有了想换笔记本的想法。 5.1假期和一个好朋友特到电脑城去逛了一圈,一进电脑城便见:“HP笔记本XX总代理、IBM笔记本专卖、XX电脑YY总代理......”。
看了很多家销售店,给我印象最深的就是到处都是XX牌电脑专卖和代理商,就在同一层楼里我就见着同一牌子有6家代理销售商铺。呵呵,看来我们买电脑就直接找销售代理商就可以,没必要在找生产厂商了,厂商生产出电脑后就是要把产品推向市场销售出去,而代理商在此过程中就代替生产商销售产品。这让我想起了面向对象的设计模式--代理(Proxy)模式。
二、谈代理(Proxy)模式
1、代理模式的意图:
为其他对象提供一种代理以控制对这个对象的访问。
就以电脑销售代理商来说,他就负责提供一种代理,以控制对电脑制造商销售电脑的方法。
2、代理模式UML图(下图选自http://www.dofactory.com/):
3、代理模式的动机:
对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。问题的解决方案
是使用另一个对象,以电脑销售例子来分析,既电脑销售代理商(ComputerProxy),来替代电脑制造商 (ComputerMaker)。电脑销售代理商可以代替电脑制造商销售电脑,并且在需要的时候(客户在买电脑的时候)负责实
例化ComputerMaker对象。见下电脑销售代理图:

2

3

4

5

6

7

8

9

4、代理模式的适用性:
在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用代理(Proxy)模式。--选自《设计模式--可复用面
向对象软件基础》
比如我们现实生活中的房地产代理、职业介绍所、本文前所提到的电脑销售代理商等。
西游记里美猴子王孙悟空代高小姐出嫁猪八戒,并制服八戒的故事。
5、模式的参与者(对比上面电脑销售代理图):
抽象主题角色(Subject)
--定义真实主题角色(RealSubject)和主题代理角色(Proxy)的共用接口,这样就在任何使用真实主题角色的地方都可
以使用主题代理角色。
就如买电脑,我们可以直接找电脑制造商买电脑,也可以找电脑销售代理商买电脑。
真实主题角色(RealSubject)
--定义主题代理角色(Proxy)所代表的实体。
主题代理角色(Proxy)
--持有一个真实主题角色的引用,使得代理角色可以直接访问真实主题角色。提供一个与抽象主题角色的接口相同的接
口方法,这样代理角色就可以用来替代真实主题角色。
其他的功能依赖于代理的类型,这里就不作过多介绍,详细可查看《设计模式--可复用面向对象软件基础》或其他相
关资料。
在电脑的销售体系中,电脑销售代理商完全可以替代电脑制造商销售电脑(如果行不通就不会有那么多的代理商了)。
6、协作关系:
--代理根据其种类,在适当的时候向真实主题角色(RealSubject)转发请求。
买电脑的过程中,我们找的是电脑销售代理商,调用其销售电脑的方法(SaleComputer方法),让他销售一台或多台
电脑给我们,而他在这个时候就把请求转发给了电脑制造商(真实主题角色),调用其销售电脑的方法(SaleComputer方
法)。然而在整个代理中,主题代理角色持有一个真实主题角色的引用,既:

下:

2

3

4

5

7、模式效果
--代理模式在访问对象时引入了一定程度的间接性。
在我们买电脑的过程中,我们找电脑销售代理商买电脑,调用其销售电脑的方法,而实际是间接的调用了电脑制造商的
销售电脑方法。
三、电脑销售代理程序




四、代理(Proxy)模式大观园:
当我们去操作或控制一个对象时,如果该对象处于某种原因不能被调用方直接控制或操作,Proxy模式就该出场了。Proxy模式中的“代理”代表了被代理对象的权利和义务。而这种义务不同于法律文件规定的义务,而是设计者通过一定的设计方式,例如继承或者聚合的方式来获得的。
虽然我们的设计模式开山老祖GOF在其经典著作《设计模式》一书中阐明,Proxy模式的意图是“为其他对象提供一种代理以控制对这个对象的访问。”描述一目了然,但实际的应用方式,却需要在项目中去体现。
Proxy模式的应用非常广泛,还包括远程代理,智能代理......等。虽然实现方式不一样,但其中的原理却是相同的,要理解Proxy模式,只要明白“代理”二字的含义就可以一目了然了。----选自《软件设计精要与模式》
五、其他相关模式
Adapter:适配器(Adapter)模式为它所适配的对象提供一个 不同的接口。相反,代理模式提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。--选自《设计模式--可复用面向对象软件基础》
六、参考文献
《设计模式--可复用面向对象软件基础》
《软件设计精要与模式》
http://www.dofactory.com/
转载请注明出处:http://beniao.cnblogs.com/ 或 http://www.cnblogs.com/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述