若转载教程,请注明出自SW-X框架官方文档1
<?php/*** 设计模式之中介者模式* 场景:使用中介类,为多个类之间进行信息交互,将交互流程解耦* 小黄牛*/header("Content-type: text/html; charset=utf-8");/*** 抽象 中介者类*/abstract class Department{/*** 发送内容* $message 内容* $Colleague 同事实例*/public abstract function Declared($Message, $Colleague);}/*** 创建一个 - 技术部部门*/class Technical extends Department{public $CountryChen; // 小陈public $CountryLin; // 小林# 发送消息public function Declared($Message, $Colleague) {# 小陈的话是要传给小林的if($Colleague == $this->CountryChen){$this->CountryLin->GetMessage($Message);}else {$this->CountryChen->GetMessage($Message);}}}/*** 抽象 同事类*/abstract class Colleague{protected $Mediator; // 中介者实例# 获得中介者实例public function __construct($Mediator){$this->Mediator = $Mediator;}}/*** 创建一个同事 - 小陈*/class Chen extends Colleague{public function __construct($Mediator){parent::__construct($Mediator); // 调用父类构造方法}# 发送消息public function Declared($Message){$this->Mediator->Declared($Message, $this);}# 获得消息public function GetMessage($Message){echo "小陈获得对方消息:{$Message}<br/>";}}/*** 创建一个同事 - 小林*/class Lin extends Colleague{public function __construct($Mediator){parent::__construct($Mediator); // 调用父类构造方法}# 发送消息public function Declared($Message){$this->Mediator->Declared($Message, $this);}# 获得消息public function GetMessage($Message){echo "小林获得对方消息:{$Message}<br/>";}}# 生成中介者实例$Men = new Technical();# 实例化同事 - 小陈、小林$A = new Chen($Men);$B = new Lin($Men);$Men->CountryChen = $B; // 小陈要对小林说话$Men->CountryLin = $A; // 小林要对小陈说话$A->Declared("周经理让你过去他办公室一趟!");$B->Declared("好的,我现在就过去。");/*** 说话的顺序是,小陈让小林过去经理办公室,所以逻辑是,小陈说的话被小林获得,小林说的话被小陈获得,得出以下结果:* 小林获得对方消息:周经理让你过去他办公室一趟!* 小陈获得对方消息:好的,我现在就过去。*/
浏览器输出
小林获得对方消息:周经理让你过去他办公室一趟!小陈获得对方消息:好的,我现在就过去。
中介者模式
中介者接口(UnitedNations):在里面定义了各个同事之间相互交互所需要的方法。具体的中介者实现对象(UnitedCommit):它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系。同事类的定义(Country):通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能,具体的同事类(China):实现自己的业务,需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互。
使用场景
1、如果一组对象之间的通信方式比较复杂,导致相互依赖,结构混乱,可以采用中介者模式2、如果一个对象引用很多对象,并且跟这些对象交互,导致难以复用该对象
