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

blogdaren 2014-10-25 抢沙发 2136人次

演示代码:

 <?php
 interface Subject
 {
     public function DoAction();
 }

 class RealSubject implements Subject
 {
     public function DoAction()
     {
         echo '__RealSubject::DoAction__';
     }
 }

 class Proxy implements Subject
 {
     public function __construct()
     {
         $this->subject = new RealSubject();
     }

     public function DoAction()
     {
         echo 'Proxy::DoAction';
         $this->subject->DoAction();
         echo 'Proxy::DoAction';
     }
 }

 $proxy = new Proxy();
 $proxy->DoAction();

运行结果:

Proxy::DoAction
__RealSubject::DoAction__
Proxy::DoAction

两者区别:

    1、首先从词性来看,代理(Proxy)是名词,委派(Delegate)是动词

    2、代理说明了若干个对象实现了一个共同的接口,而委派只是说明一个对象引用了另一个对象,并不牵扯接口。

使用场景:

    那么什么时候适合使用Proxy模式呢?对PHP而言,一般是当需要给对象附加额外的逻辑时,而这些逻辑和原有逻辑又分属不同的层 次,此时就可以考虑使用Proxy模式。听起来有点拗口,说一个实际的例子,比如说我们实现了Article对象,里面封装了CRUD方法,现在我们要加入权限判断,控制CRUD的访问限制,这些新加入的逻辑属于应用逻辑,而原有的逻辑属于持久化逻辑,从分层角度看它们不应该放在一个对象里,此时就可以创建一个ArticleProxy代理对象,用来实现权限判断,至于CRUD操作,则通过委派给Article对象来完成。
    当年的JIVE论坛大量使用了此类方法,不过现在JIVE论坛早已销声匿迹,但思想还是可以借鉴的。通过使用代理模式,可以把不同侧重点的逻辑分别封装到不同的对象里去(和装饰 模式有点像,至于如何区分就是另一个话题了),从而避免God Class的产生,不过这样设计的结果会产生大量的类,孰重孰轻还得视客观情况而定。

版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:代理(Proxy)和委派(Delegate)的区别

发表评论:

您的昵称:
电子邮件:
个人主页: