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

PHP技术
347
0
0
2022-08-04

中介者模式 - 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. 聊天室。