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添加MySQL数据记录代码
Jun 07 PHP
php 分页类 扩展代码
Jun 11 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
php生成N个不重复的随机数实例
Nov 12 PHP
php利用新浪接口查询ip获取地理位置示例
Jan 20 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
两种设置php载入页面时编码的方法
Jul 29 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
Jul 15 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
Sep 23 PHP
PHP聊天室简单实现方法详解
Dec 08 PHP
解决laravel资源加载路径设置的问题
Oct 14 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
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
PHP添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
实践中学习AngularJS表单
2016/03/21 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
Vue.js样式动态绑定实现小结
2019/01/24 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
Python3处理HTTP请求的实例
2018/05/10 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
python中enumerate() 与zip()函数的使用比较实例分析
2019/09/03 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
2020/05/16 Python
python代码中怎么换行
2020/06/17 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
仓库理货员岗位职责
2013/12/18 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
Oracle中update和select 关联操作
2022/01/18 Oracle
一条 SQL 语句执行过程
2022/03/17 MySQL
Nginx利用Logrotate实现日志分割
2022/05/20 Servers