简介
通过引入一个中介者,将对象之间两两交互的情景,改为每个对象都是与中介者交互,行将网状关系改成了星状关系。毛病是中介者逻辑会很臃肿。
当零碎中呈现多对多的状况时,应该先思考设计是否正当,而尽量不要间接应用中介者。
角色
- 形象Mediator中介者
- 具体Mediator中介者
- 形象Component
- 具体Component
类图
中介者须要理解所有Component,而且notify中要编写解决所有可能产生的状况,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 "Mediator reacts on A and triggers following operations:\n"; $this->component2->doC(); } if ($event == "D") { echo "Mediator reacts on D and triggers following operations:\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 "Client triggers operation A.\n";$c1->doA();echo "\n";echo "Client triggers operation D.\n";$c2->doD();
output:
Client triggers operation A.Component 1 does A.Mediator reacts on A and triggers following operations:Component 2 does C.Client triggers operation D.Component 2 does D.Mediator reacts on D and triggers following operations:Component 1 does B.Component 2 does C.
本文由mdnice多平台公布