标签:设计模式 中介者模式
<?php /** * 3.8 中介者模式 * 定义: * 用一个中介对象来封装一系列的对象交互。中介 * 者使各对象不需要显式的相互引用,从而使其耦 * 合松散,而起可以独立的改变它们之间的交互。 * * 角色: * 1. 抽象中介者(Mediator)类 * 职责:定义了同事对象到中介者对象的接口 * 2. 具体中介者类 * 职责:实现抽象类的方法,它需要知道所有 * 具体同事类,并从具体同事接收消息 * ,向具体同事对象发出命令。 * 3. 抽象同事(Colleague)类 * 职责: * 4. 具体同事类 * 职责:每个具体同事只知道自己的行为,而 * 不了解其他同事类的情况,但它们却 * 都认识中介者对象。 * * 优点: * 1. 中介者Mediator的出现减少了各个同事Colleague * 的耦合使得可以独立的改变和复用各个Colleague * 类和Mediator; * 2. 由于把对象如何协作进行了抽象,将中介作为 * 一个独立的概念并将其封装在一个对象中,这样 * 关注的对象就从对象各自本身的行为转移到他们 * 之间的交互上来,也就是站在一个更宏观的角度 * 去看待系统。 * * 缺点: * 1. 当具体的同事类越来越多时,系统就比较难于维护了。 * * 使用场景: * 1. 一组对象以定义良好但是复杂的方式进行通信。产生 * 的相互依赖关系结构混乱且难以理解时; * 2. 一个对象引用其他很多对象并且直接与这些对象通信 * 3. 想定制一个分布在多个类中的行为,而又不想生成太 * 多的子类。 * * */ header(‘content-type:text/html;charset=utf8‘); //抽象中介者 abstract class Mediator{ //定义一个抽象的发送消息方法, //得到同事对象和发送信息。 abstract public function send($message,Colleague $colleague); } //具体中介者类 class ConcreteMediator extends Mediator{ private $colleague1; private $colleague2; public function addColleague1(ConcreteColleague1 $colleague1){ $this->colleague1=$colleague1; } public function addColleague2(ConcreteColleague2 $colleague2){ $this->colleague2=$colleague2; } public function send($message,Colleague $colleague){ if($colleague == $this->colleague1){ $this->colleague2->notify($message); }else{ $this->colleague1->notify($message) ; } } } //抽象同事类 abstract class Colleague{ protected $mediator; //构造方法,得到中介者对象 public function __construct(Mediator $mediator){ $this->mediator=$mediator; } } //具体同事类 class ConcreteColleague1 extends Colleague{ public function send($message){ //表示消息是由中介者代替发送的, //并且发送的的人是$this $this->mediator->send($message,$this); } //注意:方法notify的消息($message)是 // 由另外一个同事发给他的消息;而 // 方法send中的消息($message)是 // 他自己要发出的消息。 public function notify($message){ echo ‘同事1得到的信息是:‘.$message; } } class ConcreteColleague2 extends Colleague{ public function send($message){ $this->mediator->send($message,$this); } public function notify($message){ echo ‘同事2得到的消息是:‘.$message; } } //客户端 //生成中介 $mediator=new ConcreteMediator(); //生成发起消息的对象 $colleague1=new ConcreteColleague1($mediator); $colleague2=new ConcreteColleague2($mediator); //将所有要发送消息的人添加到中介里 $mediator->addColleague1($colleague1); $mediator->addColleague2($colleague2); //双方开始通过中介发送消息 $colleague1->send(‘我是张三,你到家了吗?‘); $colleague2->send(‘还没到,还在车上?‘); ?>
本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614791
标签:设计模式 中介者模式
原文地址:http://noican.blog.51cto.com/4081966/1614791