定義:
中介者模式(Mediator):用一個中介物件來封裝一系列的物件互動,中介者使各物件不需要顯式地相互參考,從而使其耦合松散,而且可以獨立地改變它們之間的互動,
結構:
- Mediator:抽象中介者,定義了同事物件到中介者物件的介面,
- Colleague:抽象同事類,
- ConcreteMediator:具體中介者物件,實作抽象類的方法,它需要知道所有具體同事類,并從具體同事接收訊息,向具體同事物件發出命令,
- ConcreteColleague:具體同事類,每個具體同事只知道自己的行為,而不了解其它同事類的情況,但它們卻都認識中介者物件,
- Client:客戶端代碼,
代碼實體:
/** * 抽象中介者 * Class Mediator */ abstract class Mediator { /** * 定義一個抽象的發送訊息方法,得到同事物件和發送訊息 * @param string $message 要發送的訊息 * @param Colleague $colleague 同事物件 * @return mixed */ abstract public function send($message, Colleague $colleague); } /** * 抽象同事類 * Class Colleague */ abstract class Colleague { /** * 中介者物件 * @var Mediator */ protected $mediator; public function __construct(Mediator $mediator) { $this->mediator = $mediator; } } /** * 具體中介者物件 * Class ConcreteMediator */ class ConcreteMediator extends Mediator { /** * 具體同事物件ConcreteColleague1 * @var */ private $colleague1; /** * 具體同事物件ConcreteColleague2 * @var */ private $colleague2; /** * @param $c1 */ public function setColleague1($c1) { $this->colleague1 = $c1; } /** * @param $c2 */ public function setColleague2($c2) { $this->colleague2 = $c2; } /** * 重寫發送訊息的方法,根據物件做出判斷選擇,通知相應的物件 * @param string $message * @param Colleague $colleague * @return mixed|void */ public function send($message, Colleague $colleague) { // TODO: Implement send() method. if ($colleague == $this->colleague1) { $this->colleague2->notify($message); } else { $this->colleague1->notify($message); } } } /** * 具體同事類 * Class ConcreteColleague1 */ class ConcreteColleague1 extends Colleague { /** * 發送訊息 * @param $message */ public function send($message) { $this->mediator->send($message, $this); } /** * 得到訊息 * @param $message */ public function notify($message) { echo "ConcreteColleague1得到訊息:{$message}<br>"; } } /** * 具體同事類 * Class ConcreteColleague2 */ class ConcreteColleague2 extends Colleague { /** * 發送訊息 * @param $message */ public function send($message) { $this->mediator->send($message, $this); } /** * 得到訊息 * @param $message */ public function notify($message) { echo "ConcreteColleague2得到訊息:{$message}<br>"; } } ##客戶端代碼 $m = new ConcreteMediator(); $c1 = new ConcreteColleague1($m); $c2 = new ConcreteColleague2($m); $m->setColleague1($c1); $m->setColleague2($c2); $c1->send("下班了嗎?"); $c2->send("還沒呢,今晚加班,"); ##測驗結果 ConcreteColleague2得到訊息:下班了嗎? ConcreteColleague1得到訊息:還沒呢,今晚加班,
總結:
- 中介者模式中Mediator的出現減少了各個Colleague的耦合,使得可以獨立地改變和復用各個Colleague類和Mediator.
- 中介者模式由于把物件如何協作進行了抽象,將中介作為一個獨立的概念并將其封裝在一個物件中,這樣關注的物件就從物件各自本身的行為轉移到它們之間的互動上來,也就是站在一個更宏觀的角度去看待系統,
- 中介者模式由于ConcreteMediator控制了集中化,于是就把互動復雜性變為了中介者的復雜性,這就使得中介者會變得比任何一個ConcreteColleague都復雜,
- 中介者模式一般應用于一組物件以定義良好但是復雜的方式進行通信的場合,以及想定制一個分布在多個類中的行為,而又不想生成太多子類的場合,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/308460.html
標籤:設計模式
上一篇:設計模式之策略
下一篇:設計模式——簡單工廠模式
