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开发GUI
Oct 09 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
smarty模板中拼接字符串的方法
Feb 14 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
PHP PDO fetch 模式各种参数的输出结果一览
Jan 07 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
关于PHP中协程和阻塞的一些理解与思考
Aug 11 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
Yii框架核心组件类实例详解
Aug 06 PHP
利用ajax+php实现商品价格计算
Mar 31 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/07/12 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
采用call方式实现js继承
2014/05/20 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
javascript实现弹幕墙效果
2019/11/28 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
[00:35]DOTA2上海特级锦标赛 EG战队宣传片
2016/03/04 DOTA
python安装Scrapy图文教程
2017/08/14 Python
python中的常量和变量代码详解
2018/07/25 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
Django框架 信号调度原理解析
2019/09/04 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
国际商务专业学生个人的自我评价
2013/09/28 职场文书
文明演讲稿范文
2014/05/12 职场文书
python lambda 表达式形式分析
2022/04/03 Python
MongoDB支持的索引类型
2022/04/11 MongoDB