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 相关文章推荐
用Flash图形化数据(一)
Oct 09 PHP
用PHP调用Oracle存储过程的方法
Sep 12 PHP
在PHP中使用redis
Nov 04 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
Oct 23 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
php中get_defined_constants函数用法实例分析
May 12 PHP
在Windows系统下使用PHP生成Word文档的教程
Jul 03 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
详解php用curl调用接口方法,get和post两种方式
Jan 13 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 PHP
详细解读php的命名空间(一)
Feb 21 PHP
php获取微信openid方法总结
Oct 10 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
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
PHP实现批量生成App各种尺寸Logo
2015/03/19 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
js 实现日期灵活格式化的小例子
2013/07/14 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
使用JavaScript实现点击循环切换图片效果
2017/09/03 Javascript
JS中call和apply函数用法实例分析
2018/06/20 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
2020/04/28 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
详解python中各种文件打开模式
2020/01/19 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
python 弧度与角度互转实例
2020/04/15 Python
中国网上药店领导者:1药网
2017/02/16 全球购物
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
餐饮业的创业计划书范文
2013/12/26 职场文书
元旦促销方案
2014/03/15 职场文书
投资合作协议书范本
2014/04/17 职场文书
伊琍体标语
2014/06/25 职场文书
学风建设主题班会
2015/08/17 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
React配置子路由的实现
2021/06/03 Javascript
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
SQL语句多表联合查询的方法示例
2022/04/18 MySQL
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技