当前位置: 首页 > 后端技术 > PHP

PHP设计模式中的中介模式

时间:2023-03-29 15:27:33 PHP

上次说过,我们在外打工的时候,经常会和一类人有很深的接触,那就是房产中介。大学毕业就可以在自己心仪的城市买房的X二代,不在我们的考虑范围之内。由于需要长租,由于工作或生活的变化,每隔一到两年或三到五年就不可避免地要和房产中介打交道。有时候,我们在租房子的时候,不一定知道房主的信息,房主也不需要知道我们的信息,一切都由中介来处理。在这里,中介就成了我们沟通的桥梁。这种情况其实就像房主出国了或者在外地有事,房子完全委托给了中介。类似这种情况,在代码世界中,就是中介者模式的典型应用。Gof类图及解释GoF定义:使用一个中介对象来封装一系列的对象交互。中介者使得对象之间不需要显式引用,从而松散耦合,它们之间的交互可以独立改变GoF类图代码实现abstractclassMediator{abstractpublicfunctionSend(String$message,Colleague$colleague);}classConcreteMediatorextendsMediator{public$colleague1;公共$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"Colleague1getsthemessage:".$消息,P}}classConcreteColleague2extendsColleague{publicfunctionSend(String$message){$this->mediator->Send($message,$this);}publicfunctionNotify(String$message){echo"Colleague2gotthemessage:".$消息;}}同事类及其具体实现。这里需要确认每个同事类只知道中介,不知道其他同事类。这是中介的特点,双方不需要满足$m=newConcreteMediator();$c1=newConcreteColleague1($m);$c2=newConcreteColleague2($m);$m->colleague1=$c1;$m->同事2=$c2;$c1->Send("你吃了吗?");$c2->Send("没有,你打算请客吗?");客户端调用比较简单!是不是觉得这种模式很适合一些通讯产品?没错,社交聊天、sns、直播等都很适合,因为这种模式可以将用户与用户解耦,不需要一个用户去维护所有关联的用户对象,因为用户不需要维护关系,所以顺便也解决了关系之间多对多维护的问题。同时不需要修改用户类来改变关系,保持了用户类的良好封装。但是中介的集中维护可能会导致这个类过于复杂和庞大,所以模式不是万能的。你必须弄清楚业务场景并做出权衡。使用中介适用于一组对象以定义明确但复杂的方式进行通信的场合,并且您想在多个类中自定义一个分布作为企业家,我知道项目管理的重要性,而项目经理扮演着在很多场合扮演中介的角色。从组织的角度来说,作为老板,我不需要关心一个项目的开始和结束具体的编码和实现由谁来负责。我想沟通的人只有项目经理。同理,其他辅助部门还有财务、人事、行政等,他们不关心代码是谁写的,只需要和项目经理沟通,了解项目情况和需要配合的内容。在项目组,写代码的人呢?也不需要知道谁来给他发工资或出勤问题出在哪里。这些都可以交给项目经理去解决。因此,项目经理负责制的项目开发是中介模式的典型应用。我们手机厂之所以发展这么快,也是多亏了这些项目经理,晚上请他们吃顿大餐吧~~~完整代码: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.phpusers)){$this->users[]=$user;}}publicfunctionDetach($user){$position=0;foreach($this->usersas$u){if($u==$user){unset($this->users[$position]);}$位置++;}}publicfunctionSend($message,$user){foreach($this->usersas$u){if($u==$user){继续;}$u->Notify($message);}}}抽象类用户{public$mediator;公共$名称;公共乐趣动作__construct($mediator,$name){$this->mediator=$mediator;$this->name=$name;}}classChatUserextendsUser{publicfunctionSend($message){$this->mediator->Send($message.'('.$this->name.'Send)',$this);}publicfunctionNotify($message){echo$this->name.'收到消息:'。$消息,PHP_EOL;}}$m=newChatMediator();$u1=newChatUser($m,'用户1');$u2=newChatUser($m,'用户2');$u3=newChatUser($m,'User3');$m->Attach($u1);$m->Attach($u3);$m->Attach($u2);$u1->Send('大家好!');//用户2和用户3收到消息$u2->Send('Hello!');//用户1和用户3收到消息$m->Detach($u2);//用户2退出聊天室$u3->Send('Welcome,welcome!');//用户1收到消息表示他是否找到了,中介就是这个“聊天室”,这里用来传递和传递信息,因为它不是固定用户数,作为一个数组来维护的。当用户发送消息时,除了他自己之外的每个人都会收到消息。聊天室可以自由进出用户。说实话,这个例子和已经实现的差不多了。一个功能性的聊天应用程序。果然,中介模式真的很适合通信应用。但是,如果进入的用户太多,$users列表就会变得越来越臃肿。这就是上面提到的中介模式。问题出在下一期。mediator模式是不是很有意思,在某些场景下确实很有用。但是前面说过,设计模式不是万能的,各种模式的组合才能形成一个完整的框架。这是现在流行的各种框架的基础。因此,学以致用,运用得当,才是我们学习的最终目的。别着急,先把模式一一摸清楚再说框架。下一篇是建造者模式,请继续期待。各媒体平台均可搜索【硬核项目经理】