php设计模式之委托模式
发布:smiling 来源: PHP粉丝网 添加日期:2021-07-09 15:00:43 浏览: 评论:0
这篇文章主要为大家详细介绍了php设计模式之委托模式,以一个实例为大家介绍了php委托模式,感兴趣的朋友可以参考一下。
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。
动态委托的介绍:动态委托概念来自于Jakarta 字节码工程库 (Byte-Code Engineering Library, BCEL)。它能够分析存在的类,并且对于接口,抽象类,甚至运行时的具体类来说,它能够生成以字节编码委托类。
被委托的接口/类应该满足如下条件:动态委托最多只能委托一个类,但是能够代理多个接口。这个限制来自于Java的单继承模式。一个Java类最多只有一个父类。既然生成的委托类把被委托类作为它的父类,那么指定多个被委托类是不合理的。如果没有指定被委托类,那么缺省的父类就是Object。
下面是PHP 反射机制实现动态代理的代码:
- <?php
- class Fruit
- {
- function callFruit()
- {
- print "Generate an Apple";
- }
- }
- class FruitDelegator
- {
- private $targets;
- function __construct()
- {
- $this->target[] = new Fruit();
- }
- function __call($name, $args)
- {
- foreach ($this->target as $obj)
- {
- $r = new ReflectionClass($obj);
- if ($method = $r->getMethod($name))
- {
- if ($method->isPublic() && !$method->isAbstract())
- {
- return $method->invoke($obj, $args);
- }
- }
- }
- }
- }
- $obj = new FruitDelegator();
- $obj->callFruit();
- // 运行结果
- // Generate an Apple
- ?>
可见,通过代理类FruitDelegator来代替Fruit类来实现他的方法。
同样的,如下的代码也是能够运行的:
- <?php
- class Color
- {
- function callColor()
- {
- print "Generate Red";
- }
- }
- class ColorDelegator
- {
- private $targets;
- function addObject($obj)
- {
- $this->target[] = $obj;
- }
- function __call($name, $args)
- {
- foreach ($this->target as $obj)
- {
- $r = new ReflectionClass($obj);
- if ($method = $r->getMethod($name))
- {
- if ($method->isPublic() && !$method->isAbstract())
- {
- return $method->invoke($obj, $args);
- }
- }
- }
- }
- }
- $obj = new ColorDelegator();
- $obj->addObject(new Color());
- $obj->callColor();
- ?>
设计了一个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
- /**
- * 委托模式 示例
- *
- * @create_date: 2010-01-04
- */
- class PlayList
- {
- var $_songs = array();
- var $_object = null;
- function PlayList($type)
- {
- $object = $type."PlayListDelegation";
- $this->_object = new $object();
- }
- function addSong($location,$title)
- {
- $this->_songs[] = array("location"=>$location,"title"=>$title);
- }
- function getPlayList()
- {
- return $this->_object->getPlayList($this->_songs);
- }
- }
- class mp3PlayListDelegation
- {
- function getPlayList($songs)
- {
- $aResult = array();
- foreach($songs as $key=>$item)
- {
- $path = pathinfo($item['location']);
- if(strtolower($item['extension']) == "mp3")
- {
- $aResult[] = $item;
- }
- }
- return $aResult;
- }
- }
- class rmvbPlayListDelegation
- {
- function getPlayList($songs)
- {
- $aResult = array();
- foreach($songs as $key=>$item)
- {
- $path = pathinfo($item['location']);
- if(strtolower($item['extension']) == "rmvb")
- {
- $aResult[] = $item;
- }
- }
- return $aResult;
- }
- }
- $oMP3PlayList = new PlayList("mp3");
- $oMP3PlayList->getPlayList();
- $oRMVBPlayList = new PlayList("rmvb");
- $oRMVBPlayList->getPlayList();
- ?>
以上就是本文的全部内容,希望对大家的学习有所帮助。
Tags: php设计模式 php委托模式
相关文章
- ·php设计模式——单例模式(Singleton)的常见应用场景(2015-04-15)
- ·php 设计模式之单例模式例子(2016-07-27)
- ·PHP设计模式之:单例模式的学习笔记(2016-07-29)
- ·PHP设计模式之:注册模式入门教程(2016-07-29)
- ·PHP设计模式之:适配器模式入门教程(2016-07-29)
- ·PHP设计模式之:数据映射模式教程(2016-07-29)
- ·PHP设计模式之:观察者模式学习笔记(2016-07-29)
- ·PHP常用设计模式之委托设计模式(2021-07-09)
- ·PHP设计模式之观察者模式实例(2021-07-10)
- ·PHP设计模式之模板方法模式定义与用法详解(2021-09-06)
- ·PHP设计模式之状态模式定义与用法详解(2021-09-06)
- ·PHP设计模式之装饰器模式定义与用法详解(2021-09-06)
- ·PHP设计模式之适配器模式定义与用法详解(2021-09-06)
- ·PHP设计模式之原型模式定义与用法详解(2021-09-06)
- ·PHP设计模式之工厂模式定义与用法详解(2021-09-06)
- ·PHP设计模式之工厂方法设计模式实例分析(2021-09-12)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)