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作为Shell脚本语言使用
Oct 09 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
Oct 11 PHP
php结合表单实现一些简单功能的例子
Jun 04 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
Nov 02 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
推荐几个开源的微信开发项目
Dec 28 PHP
学习php设计模式 php实现访问者模式(Visitor)
Dec 07 PHP
yii框架无限极分类的实现方法
Apr 08 PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
php正确输出json数据的实例讲解
Aug 21 PHP
laravel 获取某个查询的查询SQL语句方法
Oct 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中的加密功能
2006/10/09 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
javascirpt实现2个iframe之间传值的方法
2016/06/30 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Python的函数嵌套的使用方法
2014/01/24 Python
python自动12306抢票软件实现代码
2018/02/24 Python
Python中return self的用法详解
2018/07/27 Python
详解python中index()、find()方法
2019/08/29 Python
如何获取Python简单for循环索引
2019/11/21 Python
纯CSS3实现给头像加个光芒四射且旋转的背景动画效果
2014/05/07 HTML / CSS
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
《雪地里的小画家》教学反思
2014/02/22 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
丧事主持词
2015/07/02 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python