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

模式是程序员之间的交流语言,代理(Proxy)和委派(Delegate)是模式面临常见的词汇,不过很多人数将她们混为一谈了,甚至当与起来,这会招不少沟通交流上之误解,下面说说他们的别,先看一个UML图:

图片 1

图片已经达的雅直白了,如果还无清,可以看下面的代码:

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的起,不过这样设计之结果会发生大量底类似,孰重孰轻还得盼客观情况而早晚。

相关文章