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 相关文章推荐
PHP 柱状图实现代码
Dec 04 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
深入解析php中的foreach函数
Aug 31 PHP
PHP上传图片进行等比缩放可增加水印功能
Jan 13 PHP
ThinkPHP控制器详解
Jul 27 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
PHP面向对象程序设计实例分析
Jan 26 PHP
php支持断点续传、分块下载的类
May 02 PHP
php实现转换html格式为文本格式的方法
May 16 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
Jun 12 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获取Exif缩略图的方法
2015/07/13 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
brook javascript框架介绍
2011/10/10 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
vue跨域解决方法
2017/10/15 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
Vue程序调试的方法
2019/06/17 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
iview实现图片上传功能
2020/06/29 Javascript
python3操作mysql数据库的方法
2017/06/23 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
CSS3 边框效果
2019/11/04 HTML / CSS
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
高中自我评价分享
2013/12/05 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
大学生简历求职信
2014/06/24 职场文书
贷款担保书
2015/01/20 职场文书
运输公司工作总结
2015/08/11 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle