第 2 章 代理模式

header("Content-type: text/html; charset=UTF-8");
/**
 * 什麼是代理模式呢?我很忙,忙的沒空理你,那你要找我呢就先找我的代理人吧,
 * 那代理人總要知道被代理人能做哪些事情不能做哪些事情吧,那就是兩個人具備同一個接口,
 * 代理人雖然不能幹活,但是被代理的人能幹活呀。
 */

// 比如西門慶找潘金蓮,那潘金蓮不好意思答覆呀,咋辦,找那個王婆做代理,表現在程序上時這樣的:

// 先定義一種類型的女人:
/**
 * 定義一種類型的女人,王婆和潘金蓮都屬於這個類型的女人
 */
interface KindWomen{
    //這種類型的女人能做什麼事情呢?
    public function makeEyesWithMan(); //拋媚眼
    
    public function happyWithMan(); //happy what? You know that!
}



/**
 * 定義一個潘金蓮是什麼樣的人
 */
class PanJinLian implements KindWomen {
    
    public function makeEyesWithMan(){
        echo ("潘金蓮拋媚眼");
    }
    
    public function happyWithMan(){
        echo ("潘金蓮在和男人做那個.....");
    }
}


//再定一個醜陋的王婆:

/**
 * 王婆這個人老聰明瞭,她太老了,是個男人都看不上,
 * 但是她有智慧有經驗呀,她作爲一類女人的代理!
 */
class WangPo implements KindWomen {
    private $kindWomen;
    
    /**
     * 她可以是KindWomen的任何一個女人的代理,只要你是這一類型
     * 默認的話,是潘金蓮的代理
     * @param null|KindWomen $kindWomen
     */
    public function __construct($kindWomen = null){
        if(is_object($kindWomen) || $kindWomen instanceof KindWomen){
            $this->kindWomen = $kindWomen;
        }else{
            $this->kindWomen = new PanJinLian();
        }
    }
    
    public function makeEyesWithMan(){
        $this->kindWomen->makeEyesWithMan(); //王婆這麼大年齡了,誰看她拋媚眼?!    
    }
    
    public function happyWithMan() {
        $this->kindWomen->happyWithMan(); //自己老了,幹不了,可以讓年輕的代替
    }
}


// 兩個女主角都上場了,男主角也該出現了:

/**
 * 定義一個西門慶,這人色中餓鬼
 */
class XiMenQing {
    
    /**
     * 水滸裏是這樣寫的:西門慶被潘金蓮用竹竿敲了一下難道,癡迷了,
     * 被王婆看到了, 就開始撮合兩人好事,王婆作爲潘金蓮的代理人
     * 收了不少好處費,那我們假設一下:
     * 如果沒有王婆在中間牽線,這兩個不要臉的能成嗎?難說的很!
     */
    public function __construct() {
        //把王婆叫出來
        $wangPo = new WangPo();
        
        //然後西門慶就說,我要和潘金蓮happy,然後王婆就安排了西門慶丟筷子的那齣戲:
        $wangPo->makeEyesWithMan(); //看到沒,雖然表面上時王婆在做,實際上爽的是潘金蓮
        echo "<br><br><br><br>";
        $wangPo->happyWithMan();
        echo "<br><br><br><br>";
        
        //改編一下歷史,賈氏被西門慶勾走:
        $jiaShi = new JiaShi();
        $wangPo = new WangPo($jiaShi); //讓王婆作爲賈氏的代理人
        $wangPo->makeEyesWithMan();
        echo "<br><br><br><br>";
        $wangPo->happyWithMan();
        echo "<br><br><br><br>";
    }
}


/*
 * 那這就是活生生的一個例子,通過代理人實現了某種目的,如果真去掉王婆這個中間環節,直接是西
 * 門慶和潘金蓮勾搭,估計很難成就武松殺嫂事件。
 * 那我們再考慮一下,水滸裏還有沒有這類型的女人?有,盧俊義的老婆賈氏(就是和那個固管家苟合
 * 的那個),這名字起的:“假使”,那我們也讓王婆做她的代理:
 */

// 把賈氏素描出來:
class JiaShi implements KindWomen {
    
    public function makeEyesWithMan(){
        echo ("賈氏拋媚眼");
    }
    
    public function happyWithMan(){
        echo ("賈氏正在Happy中......");
    }    
}


// 西門慶勾賈氏:看上面類XiMenQing

new XiMenQing();


運行結果如下:

潘金蓮拋媚眼



潘金蓮在和男人做那個.....



賈氏拋媚眼



賈氏正在Happy中......













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章