极简设计模式-中介者模式

中介者模式 - Mediator Pattern

定义

用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

设计的原则和思想

  1. 解耦的各个对象之间的依赖。
  2. 不变部分是各个对象之间的依赖关系,变化部分是各个对象所依赖的对象(中介者模式用中介者去替换之前的依赖关系)。
  3. 核心思想是将网状结构的关系转换成星型结构的关系,即多对多转换成一对多的关系。

一句话概括设计模式

中介者类管理所有类的关系。

结构中包含的角色

  1. Mediator(抽象中介者)
  2. ConcreteMediator(具体中介者)
  3. Colleague(抽象同事类)
  4. ConcreteColleague(具体同事类)

最小可表达代码

// 抽象中介者
abstract class Mediator 
{
    public abstract function execute();  
} 

// 具体中介者
class ConcreteMediator extends Mediator
{  
    public function execute()
    {
        echo '具体中介者';
    }
}

// 抽象同事类
abstract class Colleague
{
    protected $mediator;

    public function __construct(Mediator $mediator)
    {
        $this->mediator = $mediator;  
    }

    // 声明自身方法,处理自己的行为
    public abstract function method1();

    // 与中介者进行通信  
    public function method2()
    {
        $this->mediator->execute();
    }  
}

// 具体同事类
class ConcreteColleague extends Colleague
{
    public function method1()
    {
        echo '具体自身方法';
    }
}

$mediator = new ConcreteMediator();
$colleague = new ConcreteColleague($mediator);
$colleague->method1();
$colleague->method2();

优点

  1. 中介者模式简化了对象之间的交互, 从网状结构转换成相对简单的星型结构。
  2. 中介者模式可将各同事对象解耦。
  3. 无需修改实际组件就能增加新的中介者。
  4. 降低了类的复杂度,更方便地复用各个组件。

缺点

  1. 具体中介者类中包含了大量同事之间的交互细节,会导致具体中介者类非常复杂。
  2. 中介者会越来越庞大,变得复杂难以维护。

何时使用

  1. 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
  2. 当一些对象和其他对象紧密耦合以致难以对其进行修改时。
  3. 当组件因过于依赖其他组件而无法在不同应用中复用时。

实际应用场景

  1. 找中介租房。
  2. 聊天室。
本作品采用《CC 协议》,转载必须注明作者和本文链接
Long2Ge
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!