php設計模式之代理模式

來源:互聯網
上載者:User
代理模式【PROXY PATTERN】

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 "



";
$wangPo->happyWithMan();
echo "



";

//改編一下曆史,賈氏被西門慶勾走:
$jiaShi = new JiaShi();
$wangPo = new WangPo($jiaShi); //讓王婆作為賈氏的代理人
$wangPo->makeEyesWithMan();
echo "



";
$wangPo->happyWithMan();
echo "



";
}
}


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

// 把賈氏素描出來:
class JiaShi implements KindWomen {

public function makeEyesWithMan(){
echo ("賈氏拋媚眼");
}

public function happyWithMan(){
echo ("賈氏正在Happy中......");
}
}


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

new XiMenQing();



運行結果如下:

潘金蓮拋媚眼



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



賈氏拋媚眼



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

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.