中介者模式 - Mediator Pattern
定义
用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
设计的原则和思想
- 解耦的各个对象之间的依赖。
- 不变部分是各个对象之间的依赖关系,变化部分是各个对象所依赖的对象(中介者模式用中介者去替换之前的依赖关系)。
- 核心思想是将网状结构的关系转换成星型结构的关系,即多对多转换成一对多的关系。
一句话概括设计模式
中介者类管理所有类的关系。
结构中包含的角色
- Mediator(抽象中介者)
- ConcreteMediator(具体中介者)
- Colleague(抽象同事类)
- 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(); |
优点
- 中介者模式简化了对象之间的交互, 从网状结构转换成相对简单的星型结构。
- 中介者模式可将各同事对象解耦。
- 无需修改实际组件就能增加新的中介者。
- 降低了类的复杂度,更方便地复用各个组件。
缺点
- 具体中介者类中包含了大量同事之间的交互细节,会导致具体中介者类非常复杂。
- 中介者会越来越庞大,变得复杂难以维护。
何时使用
- 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
- 当一些对象和其他对象紧密耦合以致难以对其进行修改时。
- 当组件因过于依赖其他组件而无法在不同应用中复用时。
实际应用场景
- 找中介租房。
- 聊天室。