php模式设计之 中介者模式
2015-09-08 17:48
706 查看
中介者模式
中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改。一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式。PHP中不是特别常用的设计模式。
设计场景:
我们有一个CD类和一个MP3类,两个类的结构相似。
我们需要在CD类更新的时候,同步更新MP3类。
传统的做法就是在CD类中实例化MP3类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的MP4类,那么就没法处理了。
中介者模式很好的处理了这种情况,通过中介者类,CD类中只要调用中介者这个类,就能同步更新这些数据。
我们的phpwind论坛中,之前有用到过这个设计模式。
代码:
}
$this->save();
}
public function save(){
echo "this is MP3class ! <br /><br /><br />";
}
}
//中间类
class ZhoneJie{
private $sonLists;
public function __construct(){
//等于是先注册,下一步的时候会排除一个,然后把剩余的都调用一遍
$this->sonLists [] = 'CD';
$this->sonLists [] = 'MP3';
}
public function comChange($baseObj,$parameter=array()){
//遍历初始化时候注册的 顾客
foreach($this->sonLists as $class){
//排除自身,然后剩余的其他顾客
if(!($baseObj instanceof $class)){
//把类名实例化成对象
$otherObj = new $class;
$otherObj->save($parameter);
}
}
}
}
[/code]
调用:
中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改。一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式。PHP中不是特别常用的设计模式。
设计场景:
我们有一个CD类和一个MP3类,两个类的结构相似。
我们需要在CD类更新的时候,同步更新MP3类。
传统的做法就是在CD类中实例化MP3类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的MP4类,那么就没法处理了。
中介者模式很好的处理了这种情况,通过中介者类,CD类中只要调用中介者这个类,就能同步更新这些数据。
我们的phpwind论坛中,之前有用到过这个设计模式。
代码:
<?php // | php设计模式 之中介者模式 | // +----------------------------------------------------------------------+ // | 主要的功能就是在调用cd类中的change()方法的时候也会调用mp3类中的 // | save()方法,反之亦然 // // | 例如以后再想添加一个MP4的类,新建一个MP4类以后, // | 直接在 ZhoneJie 类初始化的时候 $this->sonLists [] = 'MP4'; 就可以了 // +----------------------------------------------------------------------+ class CD{ protected $mid; public function __construct($zj=null){ $this->mid = $zj; } public function change(){ if($this->mid){ $this->mid->comChange($this); } $this->save(); } public function save(){ echo "this is CDclass ! <br /><br /><br />"; } } class MP3{ private $mid; public function __construct($zj=null){ $this->mid = $zj; } public function change(){ if($this->mid){ [code]$this
->mid->comChange(
$this
);
}
$this->save();
}
public function save(){
echo "this is MP3class ! <br /><br /><br />";
}
}
//中间类
class ZhoneJie{
private $sonLists;
public function __construct(){
//等于是先注册,下一步的时候会排除一个,然后把剩余的都调用一遍
$this->sonLists [] = 'CD';
$this->sonLists [] = 'MP3';
}
public function comChange($baseObj,$parameter=array()){
//遍历初始化时候注册的 顾客
foreach($this->sonLists as $class){
//排除自身,然后剩余的其他顾客
if(!($baseObj instanceof $class)){
//把类名实例化成对象
$otherObj = new $class;
$otherObj->save($parameter);
}
}
}
}
[/code]
调用:
//调用开始 $zj = new ZhoneJie; //new以后返回一个中介的对象,然后把这个对象传入到下面去,对象也可以当变量使用 $cd = new CD($zj); $cd->change();
相关文章推荐
- ThinkPHP函数详解:D方法
- ThinkPHP框架使用Smarty模板引擎
- ThinkPHP函数详解:I方法
- ThinkPHP3.2.3 使用常量BUILD_CONTROLLER_LIST无法生成Controller
- Yii Framework 开发教程(3) 为应用添加日志
- php判断数据库是否连接成功的测试例子
- 调试Crypt_GPG的过程
- PHP 中session_start函数
- [php5.6]用mysqli连接SAE数据库
- ThinkPHP函数详解:C方法
- PHP执行exec调用svn up时候失败问题
- php中addslashes(),htmlspecialchars()
- The PHP cURL extension must be installed to use Guzzle 错误: ubuntu 安装 php-curl 拓展
- PHP调用另一文件中的类
- php处理字符串函数
- php的curl快速入门
- Ubuntu 用vsftpd 配置FTP服务器
- php
- phpMyAdmin 安装配置
- 一个简单的PHP分页类