簡介: 中介者模式,屬於行為型的設計模式。用一個中介對象來封裝一系列的對象交互。中介者是各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的交互。 適用場景: 如果平行對象間的依賴複雜,可以使用中介者解耦。 優點: 符合迪米特法則,減少成員間的依賴。 缺點: 不適用於系統出現對 ...
簡介:
中介者模式,屬於行為型的設計模式。用一個中介對象來封裝一系列的對象交互。中介者是各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的交互。
適用場景:
如果平行對象間的依賴複雜,可以使用中介者解耦。
優點:
符合迪米特法則,減少成員間的依賴。
缺點:
不適用於系統出現對象多對多的的複雜場景時。
代碼:
*Mediator介面聲明瞭組件用於向*中介通知各種事件的方法。中介可能會對這些事件做出反應,並將執行傳遞給其他組件。
*/
interface Mediator
{
public function notify(object $sender, string $event): void;
}
/**
*具體中介通過協調幾個組件來實現協作行為。
*/
class ConcreteMediator implements Mediator
{
private $component1;
private $component2;
public function __construct(Component1 $c1, Component2 $c2)
{
$this->component1 = $c1;
$this->component1->setMediator($this);
$this->component2 = $c2;
$this->component2->setMediator($this);
}
public function notify(object $sender, string $event): void
{
if ($event == "A") {
echo "中介者對A作出反應並觸發以下操作:\n";
$this->component2->doC();
}
if ($event == "D") {
echo "中介者對D作出反應並觸發以下操作:\n";
$this->component1->doB();
$this->component2->doC();
}
}
}
/**
*基本組件提供了在組件對象記憶體儲中介器*實例的基本功能。
*/
class BaseComponent
{
protected $mediator;
public function __construct(Mediator $mediator = null)
{
$this->mediator = $mediator;
}
public function setMediator(Mediator $mediator): void
{
$this->mediator = $mediator;
}
}
/**
*具體組件實現各種功能。它們不依賴於其他組件。它們也不依賴於任何具體的中介類
*/
class Component1 extends BaseComponent
{
public function doA(): void
{
echo "Component 1 does A.\n";
$this->mediator->notify($this, "A");
}
public function doB(): void
{
echo "Component 1 does B.\n";
$this->mediator->notify($this, "B");
}
}
class Component2 extends BaseComponent
{
public function doC(): void
{
echo "Component 2 does C.\n";
$this->mediator->notify($this, "C");
}
public function doD(): void
{
echo "Component 2 does D.\n";
$this->mediator->notify($this, "D");
}
}
//調用端
$c1 = new Component1();
$c2 = new Component2();
$mediator = new ConcreteMediator($c1, $c2);
echo "客戶端觸發操作A。\n";
$c1->doA();
echo "\n";
echo "客戶端觸發操作D。\n";
$c2->doD();