PHP常用设计模式之委托设计模式


Posted in PHP onFebruary 13, 2016

模式定义

委托是对一个类的功能进行扩展和复用的方法。它的做法是:写一个附加的类提供附加的功能,并使用原来的类的实例提供原有的功能。

假设我们有一个 TeamLead 类,将其既定任务委托给一个关联辅助对象 JuniorDeveloper 来完成:本来 TeamLead 处理 writeCode 方法,Usage 调用 TeamLead 的该方法,但现在 TeamLead 将 writeCode 的实现委托给 JuniorDeveloper 的 writeBadCode 来实现,但 Usage 并没有感知在执行 writeBadCode 方法。

设计了一个cd类,类中有mp3播放模式,和mp4播放模式
改进前,使用cd类的播放模式,需要在实例化的类中去判断选择什么方式的播放模式
改进后,播放模式当做一个参数传入playList函数中,就自动能找到对应需要播放的方法。

一,未改进前

<?php 
//使用委托模式之前,调用cd类,选择cd播放模式是复杂的选择过程 
class cd { 
protected $cdInfo = array(); 
public function addSong($song) { 
$this->cdInfo[$song] = $song; 
} 
public function playMp3($song) { 
return $this->cdInfo[$song] . '.mp3'; 
} 
public function playMp4($song) { 
return $this->cdInfo[$song] . '.mp4'; 
} 
} 
$oldCd = new cd; 
$oldCd->addSong("1"); 
$oldCd->addSong("2"); 
$oldCd->addSong("3"); 
$type = 'mp3'; 
if ($type == 'mp3') { 
$oldCd->playMp3(); 
} else { 
$oldCd->playMp4(); 
}

二、通过委托模式,改进后的cd类

<?php
namespace Tools;
/*
委托模式
去除核心对象中的判决和复杂功能性
*/

//委托接口
interface Delegate{
public function playList($list,$song);
}
//mp3处理类
class mp3 implements Delegate{
public function playList($list,$song){
return $list[$song].'.mp3';
}
}
//mp4处理类
class mp4 implements Delegate{
public function playList($list, $song)
{
return $list[$song].'.mp4';
}
}
class cdDelegate{
protected $cdInfo = array();

public function addSong($song){
$this->cdInfo[$song] = $song;
}

public function play($type,$song){
$name = '\Tools\\'.$type;
$obj = new $name;
return $obj->playList($this->cdInfo,$song);
}
}
$newCd = new cdDelegate();
$newCd->addSong("1");
$newCd->addSong("2");
$newCd->addSong("3");
echo $newCd->play('mp3','1');//只要传递参数就能知道需要选择何种播放模式

以上内容给大家介绍了PHP委托设计模式实例详解,希望对大家有所帮助。

PHP 相关文章推荐
PHPThumb PHP 图片缩略图库
Mar 11 PHP
深入解析php中的foreach函数
Aug 31 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
实例介绍PHP的Reflection反射机制
Aug 05 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
Dec 17 PHP
PHP计算加权平均数的方法
Jul 16 PHP
php生成验证码函数
Oct 20 PHP
PHP编写daemon process详解及实例代码
Sep 30 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
Nov 30 PHP
php判断邮箱地址是否存在的方法
Feb 13 #PHP
php打包网站并在线压缩为zip
Feb 13 #PHP
php session 写入数据库
Feb 13 #PHP
php等比例缩放图片及剪切图片代码分享
Feb 13 #PHP
PHP信号量基本用法实例详解
Feb 12 #PHP
PHP消息队列用法实例分析
Feb 12 #PHP
PHP共享内存用法实例分析
Feb 12 #PHP
You might like
PHP中怎样防止SQL注入分析
2014/10/23 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
python读取word文档的方法
2015/05/09 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
使用Python函数进行模块化的实现
2019/11/15 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
纯净、自信、100%的羊绒服装:360Cashmere
2021/02/20 全球购物
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
外贸业务员岗位职责
2013/11/24 职场文书
大学生学习2014全国两会心得体会
2014/03/13 职场文书
社团活动总结怎么写
2014/06/30 职场文书
社区清明节活动总结
2014/07/04 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python