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 session 预定义数组
Mar 16 PHP
Joomla下利用configuration.php存储简单数据
May 19 PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
php使用codebase生成随机数
Mar 25 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
May 10 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
Jun 12 PHP
php编程每天必学之验证码
Mar 03 PHP
php中mkdir()函数的权限问题分析
Sep 24 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
php中文语义分析实现方法示例
Sep 28 PHP
php+js实现点赞功能的示例详解
Aug 07 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 session和cookie使用说明
2010/04/07 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
js图片处理示例代码
2014/05/12 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
Python验证码识别处理实例
2015/12/28 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
python图像和办公文档处理总结
2019/05/28 Python
python 三元运算符使用解析
2019/09/16 Python
python列表的逆序遍历实现
2020/04/20 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
过滤器的用法
2013/10/08 面试题
运输企业安全生产责任书
2014/07/28 职场文书
财务部岗位职责范本
2015/04/14 职场文书
倡议书范文大全
2015/04/28 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
十大必看国产动漫排名,魁拔上线,第二曾在日本播出
2022/03/18 国漫
Win11更新失败并提示0xc1900101
2022/04/19 数码科技