代理,指的就是一個角色代表另一個角色採取行動,就象生活中,一個紅酒廠商,是不會直接把紅酒零售客戶的,都是通過代理來完成他的銷售業務。而客戶,也不用爲了喝紅酒而到處找工廠,他只要找到廠商在當地的代理就行了,具體紅酒工廠在那裏,客戶不用關心,代理會幫他處理。
代理模式,就是給某一對象提供代理對象,並由代理對象控制具體對象的引用。
代理模式涉及的角色:
抽象主題角色,聲明瞭代理主題和真實主題的公共接口,使任何需要真實主題的地方都能用代理主題代替。
代理主題角色,含有真實主題的引用,從而可以在任何時候操作真實主題,代理主題功過提供和真實主題相同的接口,使它可以隨時代替真實主題。代理主題通過持有真實主題的引用,不但可以控制真實主題的創建或刪除,可以在真實主題被調用前進行攔截,或在調用後進行某些操作。
真實代理對象,定義了代理角色所代表的具體對象。
<?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();