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

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    简介:

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

    适用场景:

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

    优点:

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

    缺点:

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

    代码:

     *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.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    标签: php