中介者模式 - 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();
优点
- 中介者模式简化了对象之间的交互, 从网状结构转换成相对简单的星型结构。
- 中介者模式可将各同事对象解耦。
- 无需修改实际组件就能增加新的中介者。
- 降低了类的复杂度,更方便地复用各个组件。
缺点
- 具体中介者类中包含了大量同事之间的交互细节,会导致具体中介者类非常复杂。
- 中介者会越来越庞大,变得复杂难以维护。
何时使用
- 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
- 当一些对象和其他对象紧密耦合以致难以对其进行修改时。
- 当组件因过于依赖其他组件而无法在不同应用中复用时。
实际应用场景
- 找中介租房。
- 聊天室。