设计模式(十八):中介者模式

用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使耦合松散,而且可以独立的改变他们之间的交互.

角色

  • 抽象中介者类(AbstractMediator).
  • 具体中介者实现类(Mediator).
  • 同事类(Colleague):每一个同事角色都知道中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作
image.png

使用场景:

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

优点

  • 各个同事类之间的解耦.
  • 降低类的复杂度.

缺点

  • 同事类过多会使中介者庞大,难以维护.

示例代码

抽象中介者

 abstract class Mediator {
        //定义同事类
        private $colleagueA;
        private $colleagueB;
        
        public function setColleagueA(Colleague $colleagueA) {
            $this->colleagueA = $colleagueA;
        }
        public function setColleagueB(Colleague $colleagueB) {
            $this->colleagueB = $colleagueB;
        }
        public abstract function doSomething1();
        public abstract function doSomething2();
 }

具体中介者

class ConcreteMediator extends Mediator{

    public function doSomething1() {
        //调用同事类的方法
        $this->colleagueA->selfMethod1();
        $this->colleagueB->selfMethod2();
    }

    public function doSomething2() {
        $this->colleagueA->selfMethod2();
        $this->colleagueB->selfMethod1();
    }

}

抽象同事类

abstract class Colleague {
    protected $mediator;
    public function __construct(Mediator $mediator) {
        $this->mediator = $mediator;
    }
}

具体同事类

class ConcreteColleague  extends Colleague {
    //自有方法
    public function selfMethod(): void {
        //处理自己能处理的逻辑
    }
    //依赖方法
    public function depMethod1() {
        //处理自己能处理的逻辑
        //自己不能处理的业务逻辑,委托给中介者
        $this->mediator->doSomething1();
    }

你可能感兴趣的:(设计模式(十八):中介者模式)