写点什么

行为型设计模式 - 中介者 Mediator

作者:菜皮日记
  • 2023-09-08
    北京
  • 本文字数:1532 字

    阅读完需:约 5 分钟

简介

通过引入一个中介者,将对象之间两两交互的情景,改为每个对象都是与中介者交互,即将网状关系改成了星状关系。缺点是中介者逻辑会很臃肿。

当系统中出现多对多的情况时,应该先考虑设计是否合理,而尽量不要直接使用中介者。

角色

  • 抽象 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.
复制代码


用户头像

菜皮日记

关注

全干程序员 2018-08-08 加入

还未添加个人简介

评论

发布
暂无评论
行为型设计模式-中介者 Mediator_设计模式_菜皮日记_InfoQ写作社区