捧着菠萝到处打 发表于 2023-1-26 18:39:39

浅谈PHP设计模式的中介者模式

简介:

中介者模式,属于行为型的设计模式。用一个中介对象来封装一系列的对象交互。中介者是各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
适用场景:

如果平行对象间的依赖复杂,可以使用中介者解耦。
优点:

符合迪米特法则,减少成员间的依赖。
缺点:

不适用于系统出现对象多对多的的复杂场景时。
代码:

*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();
来源:https://www.cnblogs.com/phpphp/p/17067933.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 浅谈PHP设计模式的中介者模式