本文实例讲述了PHP设计模式之中介者模式(Mediator Pattern)。分享给大家供大家参考,具体如下:
咱们先来看下中介者模式(Mediator Pattern)的定义,它就是,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,这种模式又称为调停者模式,它是一种对象行为型模式。
我们先来看用户与用户直接聊天的设计方案。
在这个方案设计的过程中,我们可以发挥想象,用户对象之间存在很强的关联性,将导致系统出现如下问题:
- 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理
- 对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱
- 系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统耦合度很高,对象操作很不灵活,扩展性差
然而,在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,但是,对于一个模块来说,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是我们使用中介者模式的动机。
来看下中介者模式包含的角色:
- Mediator: 抽象中介者,在里面定义了各个同事之间相互交互所需要的方法。
- ConcreteMediator: 具体中介者,它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系。
- Colleague:抽象同事类,通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能
- ConcreteColleague:具体同事类,实现自己的业务,需要与其他同事对象交互,就通知中介对象,中介对象会负责后续的交互
再来看下图片感受下:
来看一个完整的实例:
- 我们有一个CD类和一个MP3类,两个类的结构相似。
- 我们需要在CD类更新的时候,同步更新MP3类。
- 传统的做法就是在CD类中实例化MP3类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的MP4类,那么就没法处理了。
- 中介者模式很好的处理了这种情况,通过中介者类,CD类中只要调用中介者这个类,就能同步更新这些数据。
代码实例如下:
<"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 SeniorStudentTutor extends Tutor{ //家教类型 public $type = "SeniorStudentTutor"; 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 $serveObject = array("UndergraduateTutor","SeniorStudentTutor","MiddleStudentTutor"); //匹配学生 function matchStudent(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 = new Mediator(); $undergraduateTutor = new UndergraduateTutor(array("name"=>"张三","age"=>22),$mediator); $undergraduateTutor->findStudent(); //结果:该家教个人信息为 Array ( [name] => 张三 [age] => 22 ),将为其匹配合适的学生
好啦,本次记录就到这里了。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】