本文实例讲述了php设计模式之中介者模式(mediator pattern)。分享给大家爱或者不爱供大家参考,具体如下:
咱们先来看下中介者模式(mediator pattern)的定义,它就是,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,这种模式又称为调停者模式,它是一种对象行为型模式。
我们先来看用户与用户直接聊天的设计方案。
在这个方案设计的过程中,我们可以发挥想象,用户对象之间存在很强的关联性,将导致系统出现如下问题:
系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统耦合度很高,对象操作很不灵活,扩展性差然而,在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,但是,对于一个模块来说,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是我们使用中介者模式的动机。
来看下中介者模式包含的角色:
mediator: 抽象中介者,在里面定义了各个同事之间相互交互所需要的方法。 concretemediator: 具体中介者,它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系。 colleague:抽象同事类,通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能 concretecolleague:具体同事类,实现自己的业务,需要与其他同事对象交互,就通知中介对象,中介对象会负责后续的交互再来看下图片感受下:
来看一个完整的实例:
我们有一个cd类和一个mp3类,两个类的结构相似。我们需要在cd类更新的时候,同步更新mp3类。传统的做法就是在cd类中实例化mp3类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的mp4类,那么就没法处理了。中介者模式很好的处理了这种情况,通过中介者类,cd类中只要调用中介者这个类,就能同步更新这些数据。代码实例如下:
<?phpclass cd { public $band = ''; public $title = ''; protected $_mediator; public function __construct(musiccontainermediator $mediator = null) { $this->_mediator = $mediator; } public function save() { //具体实现待定 var_dump($this); } public function changebandname($bandname) { if ( ! is_null($this->_mediator)) { $this->_mediator->change($this, array("band" => $bandname)); } $this->band = $bandname; $this->save(); }}//mp3archive类class mp3archive { protected $_mediator; public function __construct(musiccontainermediator $mediator = null) { $this->_mediator = $mediator; } public function save() { //具体实现待定 var_dump($this); } public function changebandname($bandname) { if ( ! is_null($this->_mediator)) { $this->_mediator->change($this, array("band" => $bandname)湖南二本大学有哪些学校); } $this->band = $bandname; $this->save(); }} //中介者类class musiccontainermediator { protected $_containers = array(); public function __construct() { $this->_containers[] = "cd"; $this->_containers[] = "mp3archive"; } public function change($originalobject, $newvalue) { $title = $originalobject->title; $band = $originalobject->band; foreach ($this->_containers as $container) { if ( ! ($originalobject instanceof $container)) { $object = new $container; $object->title = $title; $object->band = $band; foreach ($newvalue as $key => $val) { $object->$key = $val; } $object->save(); } } }}//测试实例$titlefromdb = "waste of a rib";$bandfromdb = "never again";$mediator = new musiccontainermediator();$cd = new cd($mediator);$cd->title = $titlefromdb;$cd->band = $bandfromdb;$cd->changebandname("maybe once more");
运行结果:
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”
}
}
}
还有个实例,一起看下吧:
//抽象同事类,家教abstract class tutor{ protected $message; //个人信息 protected $mediator; //为家教服务的中介机构 function __construct($message,mediator $mediator){ $this->message = $message; $this->mediator = $mediator; } //获取个人信息 function getmessage(){ return $this->message; } //找学生 abstract function findstudent();}//具体同事类,大学生家教class undergraduatetutor extends tutor{ //家教类型 public $type = "undergraduatetutor"; function __construct($message,mediator $mediator){ parent::__construct($message,$mediator); } //找学生,让中介机构代为寻找 function findstudent(){ $this->mediator->matchstudent($this); }}//具体同事类,高中生家教class niorstudenttutor extends tutor{ //家教类型 public $type = "niorstudenttutor"; function __construct($message,mediator $mediator){ parent::__construct($message,$mediator); } //找学生,让中介机构代为寻找 function findstudent(){ $this->mediator->matchstudent($this); }}//具体同事类,初中生家教class middlestudenttutor extends tutor{ //家教类型 public $type = "middlestudenttutor"; function __construct($message,mediator $mediator){ parent::__construct($message,$mediator); } //找学生,让中介机构代为寻找 function findstudent(){ $this->mediator->matchstudent($this); }}//抽象中介类abstract class abstractmediator{ abstract function matchstudent(tutor $tutor);}//具体中介类,为家教匹配合适的学生class mediator extends abstractmediator{ //定义其服务的所有家教,不在范围内的不服务 private $rveobject = array("undergraduatetutor","niorstudenttutor","middlestudenttutor"); //匹配学生 function matchstudent(tutor $tutor){ for($i=0;$i<count($this->rveobject);$i++){ if($tutor->type == $this->rveobject[$i]){ $message = $tutor->getmessage(); echo "该家教个人信息为".print_r($message)."<br/>将为其匹配合适的学生"; 如意人才网break; } } if($i>=count($this->s英国初中留学申请erveobject)){ echo "该家教不在我中介机构服务范围内"; } }}//测试$mediator = new mediator();$undergraduatetutor = new undergraduatetutor(array("name"=>"张三","age"=>22),$mediator);$undergraduatetutor->findstudent();//结果:该家教个人信息为 array ( [name] => 张三 [age] => 22 ),将为其匹配合适的学生
好中草药的种植啦,本次记录就到这里了。
本文发布于:2023-04-08 04:35:38,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/389d6962d6b93f2b3ec9f4d816b3baa0.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解.doc
本文 PDF 下载地址:PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解.pdf
留言与评论(共有 0 条评论) |