设计模式(十八):中介者模式
2019-05-20 本文已影响0人
何笙
用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使耦合松散,而且可以独立的改变他们之间的交互.
角色
- 抽象中介者类(AbstractMediator).
- 具体中介者实现类(Mediator).
- 同事类(Colleague):每一个同事角色都知道中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作
使用场景:
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();
}