[转]代理(Proxy)和委派(Delegate)的区别

简介: 模式是程序员之间的交流语言,代理(Proxy)和委派(Delegate)是模式中常见的词汇,不过很多人把他们混淆了,甚至等同起来,这会造成很多沟通交流上的误解,下面说说他们的区别,先看一个UML图: 图形已经表述的很直白了,如果还不清晰,可以看看下面的代码: 01 interface Subject...
模式是程序员之间的交流语言,代理(Proxy)和委派(Delegate)是模式中常见的词汇,不过很多人把他们混淆了,甚至等同起来,这会造成很多沟通交流上的误解,下面说说他们的区别,先看一个UML图:



图形已经表述的很直白了,如果还不清晰,可以看看下面的代码:

01 interface Subject
02 {
03     public function DoAction();
04 }
05
06 class RealSubject implements Subject
07 {
08     public function DoAction()
09     {
10         echo '_RealSubject::DoAction_';
11     }
12 }
13
14 class Proxy implements Subject
15 {
16     public function __construct()
17     {
18         $this->subject = new RealSubject();
19     }
20
21     public function DoAction()
22     {
23         echo 'Proxy::DoAction';
24         $this->subject->DoAction();
25         echo 'Proxy::DoAction';
26     }
27 }
28
29 $proxy = new Proxy();
30 $proxy->DoAction();

运行结果输出:Proxy::DoAction_RealSubject::DoAction_Proxy::DoAction

如果你还没有看出端倪,我就再废话几句:首先从词性来看,代理(Proxy)是名词,委派(Delegate)是动词,其次代理说明了若干个对象实现了一个共同的接口,而委派只是说明一个对象引用了另一个对象,并不牵扯接口。

既然说到这了,就再唠叨几句:什么时候适合使用Proxy模式呢?对PHP而言,一般是当需要给对象附加额外的逻辑时,而这些逻辑和原有逻辑又分属不同的 层次,此时就可以考虑使用Proxy模式。听起来有点拗口,说一个实际的例子,比如说我们实现了Article对象,里面封装了CRUD方法,现在我们要 加入权限判断,控制CRUD的访问限制,这些新加入的逻辑属于应用逻辑,而原有的逻辑属于持久化逻辑,从分层角度看它们不应该放在一个对象里,此时就可以 创建一个ArticleProxy代理对象,用来实现权限判断,至于CRUD操作,则通过委派给Article对象来完成。

当年的JIVE论坛大量使用了此类方法,不过现在JIVE论坛早已销声匿迹,但思想还是可以借鉴的。通过使用代理模式,可以把不同侧重点的逻辑分别封装到 不同的对象里去(和装饰模式有点像,至于如何区分就是另一个话题了),从而避免God Class的产生,不过这样设计的结果会产生大量的类,孰重孰轻还得视客观情况而定。
目录
相关文章
|
2月前
|
设计模式 缓存 JavaScript
什么是代理对象
【9月更文挑战第3天】什么是代理对象
101 0
|
4月前
|
Java Spring
AopContext.currentProxy();为什么能获取到代理对象
AopContext.currentProxy();为什么能获取到代理对象
163 0
|
5月前
|
JavaScript API
怎么进行代理
怎么进行代理
59 1
|
6月前
|
JavaScript 前端开发 测试技术
Proxy vs Object.defineProperty:哪种对象拦截机制更适合你?
Proxy vs Object.defineProperty:哪种对象拦截机制更适合你?
Proxy(代理)和Reflect(反射)
23. Proxy(代理)和Reflect(反射) 1. Proxy: Proxy 是一个代理器,它可以拦截对目标对象的各种操作,包括读取属性、设置属性、函数调用等等。通过使用 Proxy,我们可以在这些操作前后注入自定义逻辑,对这些操作进行拦截、修改、记录等等。这使得我们可以更好地控制对象的行为,实现一些高级的功能。
代理
概念 代理:代替处理,又称委托模式。 实现:为目标对象提供(包装)了一个代理,这个代理可以控制对目标对象的访问。外界不直接访问目标对象,而是访问代理对象,再由代理对象调用目标对象。
549 0
Proxy代理数据拦截方法
**Proxy** 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。
179 0
Proxy代理数据拦截方法
es6 代理(Reflect)和反射(Proxy)的学习总结
es6 代理(Reflect)和反射(Proxy)的学习总结
|
存储 设计模式 Java
Proxy动态代理机制详解
代理模式给某一个(目标)对象提供一个代理对象,并由代理对象持有目标对象的引用,所谓代理,就是一个对象代表另一个对象执行相应的动作程序。
99 0
Proxy动态代理机制详解
|
设计模式 Java 索引
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )
124 0
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )