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 相关文章推荐
mysql5详细安装教程
Jan 15 PHP
PHP 源代码压缩小工具
Dec 22 PHP
PHP文件读写操作之文件写入代码
Jan 13 PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 PHP
thinkphp中html:list标签传递多个参数实例
Oct 30 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
Yii中Model(模型)的创建及使用方法
Dec 28 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
May 04 PHP
详解php用static方法的原因
Sep 12 PHP
thinkphp5使用无限极分类
Feb 18 PHP
php提高脚本性能的4个技巧
Aug 18 PHP
PhpStorm+xdebug+postman调试技巧分享
Sep 15 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编程中八种常见的文件操作方式
2006/11/19 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
PHP重载基础知识回顾
2020/09/10 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
juqery 学习之三 选择器 简单 内容
2010/11/25 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
[04:52]2015国际邀请赛LGD战队晋级之路
2015/08/14 DOTA
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
python 连接sqlite及简单操作
2017/06/30 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
python简单商城购物车实例代码
2018/03/15 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
python 伯努利分布详解
2020/02/25 Python
python实现翻译word表格小程序
2020/02/27 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
应用艺术专业个人的自我评价
2014/01/03 职场文书
医学生临床实习自我评价
2014/03/07 职场文书
交通事故和解协议书
2014/09/25 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
《所见》教学反思
2016/02/23 职场文书
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技