PHP面向对象进阶设计模式:委托模式使用实例
什么是委托模式?
通过分配或委托至其他对象,委托设计模式能够去除核心对象中的判决和复杂的功能性。
委托模式应用问题与解决方案
大多数PHP编程人员最初接触的几乎都是程序化的编程类型。这种编程样式极大地依赖于以条件语句为基础的流控制。面向对象的编程提供了某些不同于传统条件语句的手段,从而创建了更多态的代码流。这个功能的实现方法之一是创建基于委托设计模式的对象。
委托设计模式致力于从核心对象中去除复杂性。此时我们并不设计极大依赖于通过评估条件语句而执行特定功能性的对象,基于委托模式的对象能够将判决委托给不同的对象。委托既可以像使用中间对象处理判决树一样简单,也可以像使用动态实例化对象提供期望的功能一样复杂。
不要将委托设计模式视为条件语句的直接竞争者,这是非常重要的。相反,委托设计模式通过不需要条件语句就可以调用正确功能性的方式来帮助构成体系结构。条件语句最好驻留在实际方法中,并且在方法中完成对业务规则的处理。
委托设计模式的一个使用示例是为特定数据部分提供多种格式。假设在开放资源代码库中存在一个归档。当访问者打算下载部分源代码时,他们可以选择两种不同格式的文件。指定文件被压缩后将被发送至浏览器。在这个示例中,我打算采用zip和tgz压缩格式的文件。
当一个对象包含复杂但独立的、必须基于判决执行的功能性的若*分时,最佳的做法是使用基于委托设计模式的对象。
UML
该UML图详细说明了一个使用委托设计模式的类设计。
下面是对上图的说明:
1.基类MyObject知道会使用基于委托设计模式的对象。这个类包含私有字符字符串delegateType以及MyDelegateObject的私有实例internalDelegate。
2.setDelegateType()方法接收一个名为type的参数,这个参数被存储在delegateType字符串中。
3.createDelegateObject()方法会创建委托对象的一个实例,并且根据delegateType变量为实例命名。随后,通过将该实例指派给internalDelegate,这个方法讲其存储在内部。
4.runDelegateAction()方法负责运行internalDelegate对象的action()方法。
5.MyDelegateObject包含负责特定动作的逻辑。MyObject运行action()方法实现具体的功能。
应用场景
设计了一个cd类,类中有mp3播放模式,和mp4播放模式
改进前,使用cd类的播放模式,需要在实例化的类中去判断选择什么方式的播放模式
改进后,播放模式当做一个参数传入playList函数中,就自动能找到对应需要播放的方法。
代码:cd类,未改进之前,选择播放模式是一种痛苦的事情
使用实例:
<?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 //委托模式-去除核心对象中的判决和复杂的功能性 //改进cd类 class cdDelegate { protected $cdInfo = array(); public function addSong($song) { $this->cdInfo[$song] = $song; } public function play($type, $song) { $obj = new $type; return $obj->playList($this->cdInfo, $song); } } class mp3 { public function playList($list) { return $list[$song]; } } class mp4 { public function playList($list) { return $list[$song]; } } $newCd = new cd; $newCd->addSong("1"); $newCd->addSong("2"); $newCd->addSong("3"); $type = 'mp3'; $oldCd->play('mp3', '1'); //只要传递参数就能知道需要选择何种播放模式
以上就是PHP面向对象进阶设计模式:委托模式使用实例的详细内容,更多请关注其它相关文章!
推荐阅读
-
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
-
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
-
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
-
Javascript oop设计模式 面向对象编程简单实例介绍
-
《Head First 设计模式》代码之PHP版(面向对象学习)第1/2页
-
PHP面向对象学习笔记之二 生成对象的设计模式
-
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
-
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
-
Javascript oop设计模式 面向对象编程简单实例介绍
-
PHP 进阶篇:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 (麦子学员 第三阶段)