GoF类图
中介者模式
代码实现

abstractclassMediator{abstractpublicfunctionSend(String$message,Colleague$colleague);}classConcreteMediatorextendsMediator{public$colleague1;public$colleague2;publicfunctionSend(String$message,Colleague$colleague){if($colleague==$this->colleague1){$this->colleague2->Notify($message);}else{$this->colleague1->Notify($message);}}}
抽象出来的中介者和详细的实现,在这里,我们假定有固定的两个同事类,让他们相互对话,以是进入的同事是1的时候,就去调用2的Notify方法,相称于是让2吸收到了1发来的
abstractclassColleague{protected$mediator;publicfunction__construct(Mediator$mediator){$this->mediator=$mediator;}}classConcreteColleague1extendsColleague{publicfunctionSend(String$message){$this->mediator->Send($message,$this);}publicfunctionNotify(String$message){echo"同事1得到信息:".$message,PHP_EOL;}}classConcreteColleague2extendsColleague{publicfunctionSend(String$message){$this->mediator->Send($message,$this);}publicfunctionNotify(String$message){echo"同事2得到信息:".$message;}}
同事类及详细的实现,这里我们要确认的一点便是,每一个同事类,只认识中介者,并不认识其余的同事类,这便是中介者的特点,双方不用认识。
$m=newConcreteMediator();$c1=newConcreteColleague1($m);$c2=newConcreteColleague2($m);$m->colleague1=$c1;$m->colleague2=$c2;$c1->Send("吃过饭了吗?");$c2->Send("没有呢,你打算宴客?");
客户真个调用就比较很大略啦!
作为一名企业家,深知项目管理的主要性,而项目经理,在很多场合下便是一名中介者的角色。从组织角度看,一个项目的开始和结束,作为老板的我并不须要关心是由谁来详细编码实现,我要沟通的人只是项目经理。同理,其他赞助部门包括财务、人事、行政等,他们也不关心谁来写代码,而只须要和项目经理互换理解项目的情形以及须要合营的内容。在项目团队中,写代码的人呢?也不须要知道谁来给他发人为或者考勤问题出在哪里,这统统也交给项目经理办理就好了。以是说,项目经理卖力制的项目开拓,便是中介者模式的范例运用。我们的手机厂之以是发展的如此之快,也多亏了这些项目经理们,晚上请他们吃大餐去咯~~~
完全代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/15.mediator/source/mediator.php
实例这回我们不发短信了,实现一个谈天室吧。一个大略的在线谈天室,需求便是让进入谈天室的用户都可以在线谈天,让我们来看看利用中介者模式来如何实现这个谈天室吧!
谈天室类图
谈天室功能中介者模式版
完全源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/15.mediator/source/mediator-webchat.php
<?phpabstractclassMediator{abstractpublicfunctionSend($message,$user);}classChatMediatorextendsMediator{public$users=[];publicfunctionAttach($user){if(!in_array($user,$this->users)){$this->users[]=$user;}}publicfunctionDetach($user){$position=0;foreach($this->usersas$u){if($u==$user){unset($this->users[$position]);}$position++;}}publicfunctionSend($message,$user){foreach($this->usersas$u){if($u==$user){continue;}$u->Notify($message);}}}abstractclassUser{public$mediator;public$name;publicfunction__construct($mediator,$name){$this->mediator=$mediator;$this->name=$name;}}classChatUserextendsUser{publicfunctionSend($message){$this->mediator->Send($message.'('.$this->name.'发送)',$this);}publicfunctionNotify($message){echo$this->name.'收到:'.$message,PHP_EOL;}}$m=newChatMediator();$u1=newChatUser($m,'用户1');$u2=newChatUser($m,'用户2');$u3=newChatUser($m,'用户3');$m->Attach($u1);$m->Attach($u3);$m->Attach($u2);$u1->Send('Hello,大家好呀!
');//用户2、用户3收到$u2->Send('你好呀!
');//用户1、用户3收到$m->Detach($u2);//用户2退出谈天室$u3->Send('欢迎欢迎!
');//用户1收到
解释
有没有创造,中介者便是这个“谈天室”,由它来进行信息的通报转移这里由于不固定用户人数,因此是一个数组掩护的,当用户发送的时候,除了他自己,其他人都收到了这条谈天室可以自由地进出用户,说实话,这个例子真的很像一个已经差不多实现功能了的谈天运用哦果真中介者模式真的很适宜通信方面的运用,但是,如果进入的用户非常多,$users列表就会越来越臃肿了哦,这便是上文中所述的中介者模式的问题所在下期看点中介者模式是不是很有趣,在某些场景下也确实非常有用。但是就像之前说的,设计模式并不是万能药,利用各种模式的组合才能形成完全的框架。这便是现在盛行的各种框架的根本。以是,学甚至用,并且得当的用,才是我们学习的终极目标。别急别急,先把模式一个一个弄清楚了再说框架的事,下一个即将到来的是建造者模式,还请连续期待哟。