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 相关文章推荐
dedecms系统常用术语汇总
Apr 03 PHP
php中time()和mktime()方法的区别
Sep 28 PHP
php强制运行广告的方法
Dec 01 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
php中如何执行linux命令详解
Nov 06 PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 PHP
Laravel 实现关系模型取出需要的字段
Oct 10 PHP
Yii框架where查询用法实例分析
Oct 22 PHP
laravel 查询数据库获取结果实现判断是否为空
Oct 24 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 PHP
php屏蔽错误及提示的方法
May 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
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
jquery 查找新建元素代码
2010/07/06 Javascript
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
javascript self对象使用详解
2016/10/18 Javascript
Angular的MVC和作用域
2016/12/26 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
浅谈React高阶组件
2018/03/28 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
JS实现随机点名器
2020/04/12 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
python paramiko实现ssh远程访问的方法
2013/12/03 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
在Django的视图(View)外使用Session的方法
2015/07/23 Python
详解Python多线程
2016/11/14 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
构造方法和其他方法的区别
2016/04/26 面试题
十一酒店活动方案
2014/02/20 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
求职意向书
2014/07/29 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
小学优秀班主任材料
2014/12/17 职场文书
科级干部培训心得体会
2016/01/06 职场文书