中介者模式用一個中介對象封裝一系列對象交互,使各對象不需顯式相互引用,從而鬆散耦合,並能獨立改變交互行為。避免「網狀結構」的相互依賴,將多對多關係轉為一對多(中介者與同事)。
<?php
/**
* 中介者模式
* 用一個中介對象來封裝一系列的對象交互
*/
abstract class Mediator {
abstract public function send($message, $colleague);
}
abstract class Colleague {
private $_mediator = null;
public function __construct($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->_colleague2->notify($message);
} else {
$this->_colleague1->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");
?>
中介者模式將交互邏輯集中化,降低類別間耦合,符合迪米特法則。適用於多對象複雜交互(如對話框控件協調、航管系統、聊天室伺服器)。但中介者本身可能變得複雜,需權衡。