代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务。而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行了,具体红酒工厂在那里,客户不用关心,代理会帮他处理。

 

代理模式,就是给某一对象提供代理对象,并由代理对象控制具体对象的引用。

 

代理模式涉及的角色:

 

抽象主题角色,声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替。

代理主题角色,含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题。代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作。

真实代理对象,定义了代理角色所代表的具体对象。

<?php

//定义一种类型的女人,王婆和潘金莲都属于这个类型的女人

interface KindWomen

  //这种类型的女人能做什么事情呢?

 public function makeEyesWithMan();//抛媚眼

  publicfunction happyWithMan();//happy what? You know that!

}

 

//定一个潘金莲是什么样的人

class PanJinLian implements KindWomen

{

       public function happyWithMan() {                

                echo "潘金莲在和男人做那个.....";

       }

       public function makeEyesWithMan() {

                echo "潘金莲抛媚眼";

       }

}

 

//王婆这个人老聪明了,她太老了,是个男人都看不上,

//但是她有智慧有经验呀,她作为一类女人的代理!

class WangPo implements KindWomen {

       var $kindWomen;

 

       //她可以是KindWomen的任何一个女人的代理,只要你是这一类型

       public function WangPo($kindWomen = null){

                if (empty($kindWomen)) {

                        $this->kindWomen =new PanJinLian();//默认的话,是潘金莲的代理 

                }else{

                        $this->kindWomen =$kindWomen;

                }

       }

       //自己老了,干不了,可以让年轻的代替

       public function happyWithMan() {

               $this->kindWomen->happyWithMan(); 

       }

        //王婆这么大年龄了,谁看她抛媚眼?!

       public function makeEyesWithMan() {

               $this->kindWomen->makeEyesWithMan(); 

        } 

}

 

 

//定义一个西门庆,这人色中饿鬼

class XiMenQing

{

  /*

  * 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,

  * 被王婆看到了就开始撮合两人好事,王婆作为潘金莲的代理人

  * 收了不少好处费,那我们假设一下:

  * 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!

  */

 public function __construct() {

       //把王婆叫出来

       $wangPo = new WangPo();   

       //然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的那出戏:

         $wangPo->makeEyesWithMan();  //看到没,虽然表面上时王婆在做,实际上爽的是潘金莲

         $wangPo->happyWithMan();

  }

}

 

//开搞了

$XiMengQing = new XiMenQing();