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 相关文章推荐
async和DOM Script文件加载比较
Jul 20 PHP
Linux下php5.4启动脚本
Aug 03 PHP
PHP学习笔记(一) 简单了解PHP
Aug 04 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
Sep 27 PHP
php实现可逆加密的方法
Aug 11 PHP
常见的四种POST 提交数据方式(小总结)
Oct 08 PHP
PHP时间类完整实例(非常实用)
Dec 25 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
Nov 23 PHP
PHP 匿名函数与注意事项详细介绍
Nov 26 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
Feb 15 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下实现农历日历的代码
2007/03/07 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
php中利用explode函数分割字符串到数组
2014/02/08 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
原生JS轮播图插件
2017/02/09 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
pycharm快捷键汇总
2020/02/14 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
2020/04/20 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
优秀员工表扬信
2014/01/17 职场文书
酒鬼酒广告词
2014/03/21 职场文书
对公司的意见和建议
2015/06/04 职场文书
新闻稿标题
2015/07/18 职场文书
运动会通讯稿50字
2015/07/20 职场文书
经销商会议开幕词
2016/03/04 职场文书
晚会开幕词范文
2016/03/04 职场文书
windows安装python超详细图文教程
2021/05/21 Python