10.中介者模式
今天学习新的干货,螃蟹也不多扯了。昨天学的迭代器模式,就是对计数对象集合的遍历,避免直接操作原对象集合。中介者模式搞清楚后也不难,螃蟹还是用比喻更理解透彻一些。假如你要买房,需要从银行贷款,又要到房产公司办理手续,来来回回你跑的很辛苦,现在你直接交给中介,不用跑了。中介者模式就是类似中介做的事,这个和之前的委托模式不一样,委托模式是访问多个对象时的处理,对象之间是彼此独立,而中介者主要是处理对象之间的关系,不需要对象直接访问,通过第三方来访问就可以让彼此更松散,即便后期对象有修改也不会影响彼此的交互,也更易于维护。
参考项目模块:消息模块
说实话,螃蟹之前做过的项目中遇到对象关系特别复杂的还真想不起来了。不过最近做的一个项目的消息模块,倒是可以拿来改造。消息对象分别有系统管理员,普通用户,合作商家,之间都存在交互,正好可以使用中介者模式来重构。
消息抽象类:Message.class.php
<?php //消息抽象类 abstract class Message{ private $_mediator = null; public function __construct($mediator = null){ $this->_mediator = $mediator; } public function send($message){ $this->_mediator->send($message,$this); } abstract function output($message); } ?>
管理员:AdminMessage.class.php
<?php require_once('Message.class.php'); //消息具体类 class AdminMessage extends Message{ public function output($message){ echo 'Admin:'.$message.'<br>'; } } ?>
<?php require_once('Message.class.php'); //消息具体类 class MemberMessage extends Message{ public function output($message){ echo 'Member:'.$message.'<br>'; } } ?>
<?php require_once('Message.class.php'); //消息具体类 class ShopMessage extends Message{ public function output($message){ echo 'Shop:'.$message.'<br>'; } } ?>
<?php //抽象中介者 abstract class Mediator{ abstract public function send($message,$user); } ?>
<?php require('Mediator.class.php'); require_once('AdminMessage.class.php'); require_once('ShopMessage.class.php'); require_once('MemberMessage.class.php'); //消息中介者 class MessageMediator extends Mediator{ protected $_user = array(); public function __construct(){ array_push($this->_user,'AdminMessage'); array_push($this->_user,'MemberMessage'); array_push($this->_user,'ShopMessage'); } public function send($message,$user){ foreach ($this->_user as $countainer){ if($user instanceof $countainer){ $user -> output($message); } } } } ?>
<?php require('MessageMediator.class.php'); //测试 $mediator = new MessageMediator(); $msg1 = new MemberMessage($mediator); $msg2 = new AdminMessage($mediator); $msg3 = new ShopMessage($mediator); $msg1->send("我看看"); $msg2->send("看看"); $msg3->send("可以"); ?>
Member:我看看 Admin:看看 Shop:可以