社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
/** * 抽象中介者 * Class Mediator */ abstract class Mediator { /** * 定义一个抽象的发送消息方法,得到同事对象和发送消息 * @param string $message 要发送的消息 * @param Colleague $colleague 同事对象 * @return mixed */ abstract public function send($message, Colleague $colleague); } /** * 抽象同事类 * Class Colleague */ abstract class Colleague { /** * 中介者对象 * @var Mediator */ protected $mediator; public function __construct(Mediator $mediator) { $this->mediator = $mediator; } } /** * 具体中介者对象 * Class ConcreteMediator */ class ConcreteMediator extends Mediator { /** * 具体同事对象ConcreteColleague1 * @var */ private $colleague1; /** * 具体同事对象ConcreteColleague2 * @var */ private $colleague2; /** * @param $c1 */ public function setColleague1($c1) { $this->colleague1 = $c1; } /** * @param $c2 */ public function setColleague2($c2) { $this->colleague2 = $c2; } /** * 重写发送消息的方法,根据对象做出判断选择,通知相应的对象 * @param string $message * @param Colleague $colleague * @return mixed|void */ public function send($message, Colleague $colleague) { // TODO: Implement send() method. if ($colleague == $this->colleague1) { $this->colleague2->notify($message); } else { $this->colleague1->notify($message); } } } /** * 具体同事类 * Class ConcreteColleague1 */ class ConcreteColleague1 extends Colleague { /** * 发送消息 * @param $message */ public function send($message) { $this->mediator->send($message, $this); } /** * 得到消息 * @param $message */ public function notify($message) { echo "ConcreteColleague1得到消息:{$message}<br>"; } } /** * 具体同事类 * Class ConcreteColleague2 */ class ConcreteColleague2 extends Colleague { /** * 发送消息 * @param $message */ public function send($message) { $this->mediator->send($message, $this); } /** * 得到消息 * @param $message */ public function notify($message) { echo "ConcreteColleague2得到消息:{$message}<br>"; } } ##客户端代码 $m = new ConcreteMediator(); $c1 = new ConcreteColleague1($m); $c2 = new ConcreteColleague2($m); $m->setColleague1($c1); $m->setColleague2($c2); $c1->send("下班了吗?"); $c2->send("还没呢,今晚加班。"); ##测试结果 ConcreteColleague2得到消息:下班了吗? ConcreteColleague1得到消息:还没呢,今晚加班。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!