用一個(gè)中介者對(duì)象封裝一系列的對(duì)象交互票从,中介者使各對(duì)象不需要顯示的相互作用臀规,從而使耦合松散姥卢,而且可以獨(dú)立的改變他們之間的交互.
角色
- 抽象中介者類(AbstractMediator).
- 具體中介者實(shí)現(xiàn)類(Mediator).
- 同事類(Colleague):每一個(gè)同事角色都知道中介者角色摔蓝,而且與其他的同事角色通信的時(shí)候,一定要通過中介者角色協(xié)作
image.png
使用場(chǎng)景:
1盏触、系統(tǒng)中對(duì)象之間存在比較復(fù)雜的引用關(guān)系渗蟹,導(dǎo)致它們之間的依賴關(guān)系結(jié)構(gòu)混亂而且難以復(fù)用該對(duì)象。
2赞辩、想通過一個(gè)中間類來封裝多個(gè)類中的行為雌芽,而又不想生成太多的子類。
優(yōu)點(diǎn)
- 各個(gè)同事類之間的解耦.
- 降低類的復(fù)雜度.
缺點(diǎn)
- 同事類過多會(huì)使中介者龐大辨嗽,難以維護(hù).
示例代碼
抽象中介者
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() {
//調(diào)用同事類的方法
$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() {
//處理自己能處理的邏輯
//自己不能處理的業(yè)務(wù)邏輯世落,委托給中介者
$this->mediator->doSomething1();
}