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 相关文章推荐
拼音码表的生成
Oct 09 PHP
用Php编写注册后Email激活验证的实例代码
Mar 11 PHP
深入PHP autoload机制的详解
Jun 09 PHP
PHP代码审核的详细介绍
Jun 13 PHP
PHP实现文件下载详解
Nov 27 PHP
PHP中使用SimpleXML检查XML文件结构实例
Jan 07 PHP
PHP SPL标准库中的常用函数介绍
May 11 PHP
php给图片加文字水印
Jul 31 PHP
十个PHP高级应用技巧果断收藏
Sep 25 PHP
PHP共享内存用法实例分析
Feb 12 PHP
laravel5.1 ajax post 传值_token示例
Oct 24 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
Sep 17 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面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
jquery键盘事件介绍
2011/01/31 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
理解Python中函数的参数
2015/04/27 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
安装python及pycharm的教程图解
2019/10/10 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
Python ATM功能实现代码实例
2020/03/19 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
庆祝教师节活动方案
2014/01/31 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
Python如何将list中的string转换为int
2022/07/15 Ruby