美文网首页
设计模式(十八):中介者模式

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

作者: 何笙 | 来源:发表于2019-05-20 16:45 被阅读0次

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

    角色

    • 抽象中介者类(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();
        }
    

    相关文章

      网友评论

          本文标题:设计模式(十八):中介者模式

          本文链接:https://www.haomeiwen.com/subject/pjnraqtx.html