PHP設(shè)計模式(二十一)—中介者模式(Mediator Pattern)

中介者模式(Mediator Pattern): 用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。中介者模式又稱為調(diào)停者模式,它是一種對象行為型模式叫榕。

(一)為什么需要中介者模式

1浑侥,中介者模式可以使對象之間的關(guān)系數(shù)量急劇減少。

2晰绎,中轉(zhuǎn)作用(結(jié)構(gòu)性):通過中介者提供的中轉(zhuǎn)作用寓落,各個同事對象就不再需要顯式引用其他同事,當(dāng)需要和其他同事進(jìn)行通信時荞下,通過中介者即可伶选。該中轉(zhuǎn)作用屬于中介者在結(jié)構(gòu)上的支持。

3尖昏,協(xié)調(diào)作用(行為性):中介者可以更進(jìn)一步的對同事之間的關(guān)系進(jìn)行封裝仰税,同事可以一致地和中介者進(jìn)行交互,而不需要指明中介者需要具體怎么做抽诉,中介者根據(jù)封裝在自身內(nèi)部的協(xié)調(diào)邏輯陨簇,對同事的請求進(jìn)行進(jìn)一步處理,將同事成員之間的關(guān)系行為進(jìn)行分離和封裝迹淌。該協(xié)調(diào)作用屬于中介者在行為上的支持河绽。

(二)中介者模式 UML圖

Mediator Pattern

(三)簡單實例

中介者模式的思想在現(xiàn)實生活中也很常見,比如說交換機唉窃。沒有交換機存在的時代耙饰,每個電話之間都需要電話線連接才能進(jìn)行通話。如果一個臺電話要和其它100臺電話通話纹份,那么它就必須要有100條電話線與其它100個電話連接苟跪。

后來為了解決這種麻煩,交換機出現(xiàn)了矮嫉。每個電話只需連入交換機削咆,通話時。只需構(gòu)建一條電話-交換機-電話的鏈路蠢笋,就可以進(jìn)行通話。所以現(xiàn)在我們的電話理論上可以同世界上任何一臺電話通話鳞陨,但是只需一條電話線昨寞。當(dāng)然現(xiàn)在用電話的人少了,但是手機呀厦滤,計算機網(wǎng)絡(luò)的實現(xiàn)也是在傳統(tǒng)通信網(wǎng)的設(shè)計上進(jìn)行演進(jìn)的援岩。

其實交換機對應(yīng)的就是中介者模式的中介者,而電話機就是中介者中的同事掏导。下面享怀,就讓我們用代碼來實現(xiàn)這個思想。

<?php
//抽象同事類 --------電話機
abstract class Colleague{
    protected $mediator;    //用于存放中介者
    abstract public function sendMsg($num,$msg);
    abstract public function receiveMsg($msg);
    //設(shè)置中介者
    final public function setMediator(Mediator $mediator){
      $this->mediator = $mediator;
    }
}
//具體同事類 ---------座機
class Phone extends Colleague
{
    public function sendMsg($num,$msg)
    {
      echo __class__.'--發(fā)送聲音:'.$msg.PHP_EOL;
      $this->mediator->opreation($num,$msg);
    }

    public function receiveMsg($msg)
    {
      echo __class__.'--接收聲音:'.$msg.PHP_EOL;
    }
}
//具體同事類----------手機
class Telephone extends Colleague
{
    public function sendMsg($num,$msg)
    {
        echo __class__.'--發(fā)送聲音:'.$msg.PHP_EOL;
        $this->mediator->opreation($num,$msg);
    }
    //手機接收信息前 會智能響鈴
    public function receiveMsg($msg)
    {   
        echo '響鈴-------'.PHP_EOL;
        echo __class__.'--接收聲音:'.$msg.PHP_EOL;
    }
}
//抽象中介者類
abstract class Mediator{
  abstract public function opreation($id,$message);
  abstract public function register($id,Colleague $colleague);
}
//具體中介者類------交換機
class switches extends Mediator
{
    protected  $colleagues = array();
    //交換機業(yè)務(wù)處理
    public function opreation($num,$message)
    {
        if (!array_key_exists($num,$this->colleagues)) {
            echo __class__.'--交換機內(nèi)沒有此號碼信息趟咆,無法通話'.PHP_EOL;
        }else{
            $this->colleagues[$num]->receiveMsg($message);
        }
    }
    //注冊號碼
    public function register($num,Colleague $colleague)
    {
      if (!in_array($colleague, $this->colleagues)) {
          $this->colleagues[$num] = $colleague;
      }
      $colleague->setMediator($this);
    }
}
//實例化固話
$phone = new Phone;
//實例化手機
$telephone = new Telephone;
//實例化交換機
$switches = new Switches;
//注冊號碼  ---放號
$switches->register(6686668,$phone);
$switches->register(18813290000,$telephone);
//通話
$phone->sendMsg(18813290000,'hello world');
$telephone->sendMsg(6686668,'請說普通話');
$telephone->sendMsg(6686660,'你好');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末添瓷,一起剝皮案震驚了整個濱河市梅屉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳞贷,老刑警劉巖坯汤,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搀愧,居然都是意外死亡惰聂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門咱筛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搓幌,“玉大人,你說我怎么就攤上這事迅箩”侵郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵沙热,是天一觀的道長叉钥。 經(jīng)常有香客問我,道長篙贸,這世上最難降的妖魔是什么投队? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮爵川,結(jié)果婚禮上敷鸦,老公的妹妹穿的比我還像新娘。我一直安慰自己寝贡,他們只是感情好扒披,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著圃泡,像睡著了一般碟案。 火紅的嫁衣襯著肌膚如雪颇蜡。 梳的紋絲不亂的頭發(fā)上价说,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音风秤,去河邊找鬼鳖目。 笑死,一個胖子當(dāng)著我的面吹牛缤弦,可吹牛的內(nèi)容都是我干的领迈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狸捅!你這毒婦竟也來了衷蜓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤薪贫,失蹤者是張志新(化名)和其女友劉穎恍箭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞧省,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡扯夭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鞍匾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片交洗。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖橡淑,靈堂內(nèi)的尸體忽然破棺而出构拳,到底是詐尸還是另有隱情,我是刑警寧澤梁棠,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布置森,位于F島的核電站,受9級特大地震影響符糊,放射性物質(zhì)發(fā)生泄漏凫海。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一男娄、第九天 我趴在偏房一處隱蔽的房頂上張望行贪。 院中可真熱鬧,春花似錦模闲、人聲如沸建瘫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啰脚。三九已至,卻和暖如春翁授,著一層夾襖步出監(jiān)牢的瞬間拣播,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工收擦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谍倦。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓塞赂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昼蛀。 傳聞我的和親對象是個殘疾皇子宴猾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 如果沒有主板## 大家都知道圆存,電腦里面各個配件之間的交互,主要是通過主板來完成的(事實上主...
    七寸知架構(gòu)閱讀 2,170評論 0 56
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評論 25 707
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品仇哆,去做同樣的事情沦辙,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,761評論 2 17
  • 意圖 用一個中介對象來封裝一系列的對象交互讹剔。中介者使各對象不需要顯式地相互引用油讯,從而使其耦合松散,而且可以獨立地改...
    tomas家的小撥浪鼓閱讀 1,124評論 0 0
  • 我暫且品嘗一下這深夜的孤獨 像風(fēng)扇吱呀吱呀就是不停歇 耳邊是一個兩個的呼吸聲 什么也不假 也不說話 睜開眼睛看見黑...
    南心北木mua閱讀 129評論 0 1