什麼是中介者模式?
中介者模式用於開發一個對象,這個對象能夠在類似對象相互之間不直接相互的情況下傳送或者調解對這些對象的集合的修改。一般處理具有類似屬性,需要保持同步的非耦合物件時,最佳的做法就是中介者模式。 PHP中不是特別常用的設計模式。
模式動機:
1.在使用者與使用者直接聊天的設計方案中,使用者物件之間存在著強烈的關聯性,將導致系統出現如下問題:
系統結構複雜:對象之間存在大量的相互關聯和調用,若有一個對象發生變化,則需要追蹤和該對象關聯的其他所有對象,並進行適當處理。
2.物件可重用性差:由於一個物件和其他物件具有很強的關聯,若沒有其他物件的支持,一個物件很難被另一個系統或模組重用,這些物件表現出來更像一個不可分割的整體,職責較為混亂。
3.系統擴展性低:增加一個新的對象需要在原有相關對像上增加引用,增加新的引用關係也需要調整原有對象,系統耦合度很高,對像操作很不靈活,擴展性差。
4.在物件導向的軟體設計與開發過程中,根據“單一職責原則”,我們應該盡量將物件細化,使其只負責或呈現單一的職責。
5.對於一個模組,可能由很多物件構成,而且這些物件之間可能存在相互的引用,為了減少物件兩兩之間複雜的引用關係,使之成為一個鬆散耦合的系統,我們需要使用中介者模式,這就是中介者模式的模式動機。
UML
此UML圖說明了一個使用中介者設計模式的類別設計
下面是上圖的說明:
1.圖中存在兩個相似的類別:MyObjectA和MyObjectB。這兩個類別顯現的外形是相同的。它們的差異可能是用私有變數identifier表示的識別字。此外,所有函數都是相似的。
2.在物件建立期間,MyObjectMediator的實例被儲存在內部。隨後,如果透過呼叫公用方法cahngeIdentifier()請求針對某個物件的變化,那麼參數newID透過更新私有識別字串就能夠被套用到該物件。接下來,呼叫保護方法notifyMediator()接可以對其餘物件應用中介。
3.MyObjectMediator是一系列物件的中心所在。這些物件儲存在數組MyObjectsToMediate中。 MyObjectsToMediate接到通知時就會執行myObjectChanged()方法,負責解析陣列MyObjectsToMediate並對其他所有物件套用指定的變更。
用一個中介物件來封裝一系列的物件互動,使各物件不需要明確地相互引用從而使其耦合鬆散,而且可以獨立地改變它們之間的交互作用
<?php /** * 中介者模式 * * 用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互 */ abstract class Mediator { abstract public function send($message,$colleague); } abstract class Colleague { private $_mediator = null; public function Colleague($mediator) { $this->_mediator = $mediator; } public function send($message) { $this->_mediator->send($message,$this); } abstract public function notify($message); } class ConcreteMediator extends Mediator { private $_colleague1 = null; private $_colleague2 = null; public function send($message,$colleague) { if($colleague == $this->_colleague1) { $this->_colleague1->notify($message); } else { $this->_colleague2->notify($message); } } public function set($colleague1,$colleague2) { $this->_colleague1 = $colleague1; $this->_colleague2 = $colleague2; } } class Colleague1 extends Colleague { public function notify($message) { echo "Colleague1 Message is :".$message."<br/>"; } } class Colleague2 extends Colleague { public function notify($message) { echo "Colleague2 Message is :".$message."<br/>"; } } // $objMediator = new ConcreteMediator(); $objC1 = new Colleague1($objMediator); $objC2 = new Colleague2($objMediator); $objMediator->set($objC1,$objC2); $objC1->send("to c2 from c1"); $objC2->send("to c1 from c2");
以上是PHP物件導向進階設計模式:中介者模式使用實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!