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获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 PHP
win10环境PHP 7 安装配置【教程】
May 09 PHP
php处理json格式数据经典案例总结
May 19 PHP
Laravel5.1自定义500错误页面示例
Oct 09 PHP
PHP实现的分页类定义与用法示例
Jul 05 PHP
基于Laravel5.4实现多字段登录功能方法示例
Aug 11 PHP
浅谈PHP5.6 与 PHP7.0 区别
Oct 09 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
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
php对mongodb的扩展(初出茅庐)
2012/11/11 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
js 窗口抖动示例
2013/09/04 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
关于express与koa的使用对比详解
2018/01/25 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
深入解答关于Python的11道基本面试题
2017/04/01 Python
python处理“
2019/06/10 Python
django 环境变量配置过程详解
2019/08/06 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
Python各种扩展名区别点整理
2020/02/27 Python
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
Hotels.com南非:酒店预订
2017/11/02 全球购物
师范生个人推荐信
2013/11/29 职场文书
大学毕业生的自我鉴定
2013/11/30 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
租车协议书范本2014
2014/11/17 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
2015年小学开学寄语
2015/02/27 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
青春雷锋观后感
2015/06/10 职场文书
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
MySQL窗口函数的具体使用
2021/11/17 MySQL