PHP中怎么实现中介者模式
本篇文章为大家展示了PHP中怎么实现中介者模式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理
对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱
系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统耦合度很高,对象操作很不灵活,扩展性差
然而,在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,但是,对于一个模块来说,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是我们使用中介者模式的动机。
来看下中介者模式包含的角色:
Mediator: 抽象中介者,在里面定义了各个同事之间相互交互所需要的方法。
ConcreteMediator: 具体中介者,它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系。
Colleague:抽象同事类,通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能
ConcreteColleague:具体同事类,实现自己的业务,需要与其他同事对象交互,就通知中介对象,中介对象会负责后续的交互
再来看下图片感受下:
来看一个完整的实例:
我们有一个CD类和一个MP3类,两个类的结构相似。
我们需要在CD类更新的时候,同步更新MP3类。
传统的做法就是在CD类中实例化MP3类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的MP4类,那么就没法处理了。
中介者模式很好的处理了这种情况,通过中介者类,CD类中只要调用中介者这个类,就能同步更新这些数据。
代码实例如下:
<?php classCD{ public$band=''; public$title=''; protected$_mediator; publicfunction__construct(MusicContainerMediator$mediator=NULL){ $this->_mediator=$mediator; } publicfunctionsave(){ //具体实现待定 var_dump($this); } publicfunctionchangeBandName($bandname){ if(!is_null($this->_mediator)){ $this->_mediator->change($this,array("band"=>$bandname)); } $this->band=$bandname; $this->save(); } } //MP3Archive类 classMP3Archive{ protected$_mediator; publicfunction__construct(MusicContainerMediator$mediator=NULL){ $this->_mediator=$mediator; } publicfunctionsave(){ //具体实现待定 var_dump($this); } publicfunctionchangeBandName($bandname){ if(!is_null($this->_mediator)){ $this->_mediator->change($this,array("band"=>$bandname)); } $this->band=$bandname; $this->save(); } } //中介者类 classMusicContainerMediator{ protected$_containers=array(); publicfunction__construct(){ $this->_containers[]="CD"; $this->_containers[]="MP3Archive"; } publicfunctionchange($originalObject,$newValue){ $title=$originalObject->title; $band=$originalObject->band; foreach($this->_containersas$container){ if(!($originalObjectinstanceof$container)){ $object=new$container; $object->title=$title; $object->band=$band; foreach($newValueas$key=>$val){ $object->$key=$val; } $object->save(); } } } } //测试实例 $titleFromDB="WasteofaRib"; $bandFromDB="NeverAgain"; $mediator=newMusicContainerMediator(); $cd=newCD($mediator); $cd->title=$titleFromDB; $cd->band=$bandFromDB; $cd->changeBandName("MaybeOnceMore");
运行结果:
object(MP3Archive)#3 (3) { ["_mediator":protected]=> NULL ["title"]=> string(14) "Waste of a Rib" ["band"]=> string(15) "Maybe Once More"}object(CD)#2 (3) { ["band"]=> string(15) "Maybe Once More" ["title"]=> string(14) "Waste of a Rib" ["_mediator":protected]=> object(MusicContainerMediator)#1 (1) { ["_containers":protected]=> array(2) { [0]=> string(2) "CD" [1]=> string(10) "MP3Archive" } }}
还有个实例,一起看下吧:
//抽象同事类,家教 abstractclassTutor{ protected$message;//个人信息 protected$mediator;//为家教服务的中介机构 function__construct($message,Mediator$mediator){ $this->message=$message; $this->mediator=$mediator; } //获取个人信息 functiongetMessage(){ return$this->message; } //找学生 abstractfunctionfindStudent(); } //具体同事类,大学生家教 classUndergraduateTutorextendsTutor{ //家教类型 public$type="UndergraduateTutor"; function__construct($message,Mediator$mediator){ parent::__construct($message,$mediator); } //找学生,让中介机构代为寻找 functionfindStudent(){ $this->mediator->matchStudent($this); } } //具体同事类,高中生家教 classSeniorStudentTutorextendsTutor{ //家教类型 public$type="SeniorStudentTutor"; function__construct($message,Mediator$mediator){ parent::__construct($message,$mediator); } //找学生,让中介机构代为寻找 functionfindStudent(){ $this->mediator->matchStudent($this); } } //具体同事类,初中生家教 classMiddleStudentTutorextendsTutor{ //家教类型 public$type="MiddleStudentTutor"; function__construct($message,Mediator$mediator){ parent::__construct($message,$mediator); } //找学生,让中介机构代为寻找 functionfindStudent(){ $this->mediator->matchStudent($this); } } //抽象中介类 abstractclassAbstractMediator{ abstractfunctionmatchStudent(Tutor$tutor); } //具体中介类,为家教匹配合适的学生 classMediatorextendsAbstractMediator{ //定义其服务的所有家教,不在范围内的不服务 private$serveObject=array("UndergraduateTutor","SeniorStudentTutor","MiddleStudentTutor"); //匹配学生 functionmatchStudent(Tutor$tutor){ for($i=0;$i<count($this->serveObject);$i++){ if($tutor->type==$this->serveObject[$i]){ $message=$tutor->getMessage(); echo"该家教个人信息为".print_r($message)."<br/>将为其匹配合适的学生"; break; } } if($i>=count($this->serveObject)){ echo"该家教不在我中介机构服务范围内"; } } } //测试 $mediator=newMediator(); $undergraduateTutor=newUndergraduateTutor(array("name"=>"张三","age"=>22),$mediator); $undergraduateTutor->findStudent(); //结果:该家教个人信息为Array([name]=>张三[age]=>22),将为其匹配合适的学生
上述内容就是PHP中怎么实现中介者模式,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
php字符串增加1如何实现
php字符串增加1如何实现这篇“php字符串增加1如何实现”文章的...
-
php如何判断字符串是否有中文
-
php如何实现字符串去掉头尾
-
php字符串的组成是什么
php字符串的组成是什么这篇文章主要讲解了“php字符串的组成是什...
-
php如何让Swoole/Pool进程池实现Redis持久连接
php如何让Swoole/Pool进程池实现Redis持久连接本篇...
-
php字符串长度不一致如何解决
-
php时区不正确如何解决
-
php+fread()乱码如何解决
php+fread()乱码如何解决本篇内容介绍了“php+frea...
-
php explode报错如何解决
-
linux Centos如何安装PHP7
linuxCentos如何安装PHP7今天小编给大家分享一下li...