用PHP的反射实现委托模式的讲解


Posted in PHP onMarch 22, 2019

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。

动态委托的介绍:动态委托概念来自于Jakarta 字节码工程库 (Byte-Code Engineering Library, BCEL)。它能够分析存在的类,并且对于接口,抽象类,甚至运行时的具体类来说,它能够生成以字节编码委托类。

被委托的接口/类应该满足如下条件:动态委托最多只能委托一个类,但是能够代理多个接口。这个限制来自于Java的单继承模式。一个Java类最多只有一个父类。既然生成的委托类把被委托类作为它的父类,那么指定多个被委托类是不合理的。如果没有指定被委托类,那么缺省的父类就是Object。

下面是PHP 反射机制实现动态代理的代码:

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类来实现他的方法。

同样的,如下的代码也是能够运行的:

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();
?>

传统方式:

在传统方式下,我们需要判断当前操作是取款操作还是存款操作,在分别调用Bank类中的取款操作和存款操作。

委托模式:

在委托模式下,我们将不需要客户端的判断操作,对客户端来说,需要什么操作,直接传入操作类型即可,Bank类可自动判断操作类型,返回相应操作的操作结果。当我们的操作类型非常多的时候,在客户端用if else判断无疑是很可怕的,再假如我们在很多地方都要有这块判断代码,我们需要对这些地方的判断代码都进行修改(加入后来添加的判断),而采用委托模式,我们仅仅需要在新添加的地方添加相应需要的类型即可,不需要改动其它地方的客户端代码(很大程度上提高了代码的复用性)。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
详解:――如何将图片储存在数据库里
Dec 05 PHP
PHP里的中文变量说明
Jul 23 PHP
PHP中将数组转成XML格式的实现代码
Aug 08 PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
Jun 21 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
Jun 26 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
Jun 25 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
Oct 19 PHP
PHP聊天室简单实现方法详解
Dec 08 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 PHP
PHP读取目录树的实现方法分析
Mar 22 #PHP
针对PHP开发安全问题的相关总结
Mar 22 #PHP
浅谈PHP中的Trait使用方法
Mar 22 #PHP
PHP观察者模式定义与用法实例分析
Mar 22 #PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 #PHP
PHP中$GLOBALS与global的区别详解
Mar 21 #PHP
PHP压缩图片功能的介绍
Mar 21 #PHP
You might like
分享3个php获取日历的函数
2015/09/25 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
JS实现滑动插件
2020/01/15 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
[01:11]回顾历届DOTA2国际邀请赛中国区预选赛
2017/06/26 DOTA
python 图片验证码代码分享
2012/07/04 Python
对numpy中shape的深入理解
2018/06/15 Python
python生成器与迭代器详解
2019/01/01 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
简单了解python中对象的取反运算符
2019/07/01 Python
详解Django模版中加载静态文件配置方法
2019/07/21 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
Python基于requests库爬取网站信息
2020/03/02 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
1000字打架检讨书
2014/11/03 职场文书
教师工作表现自我评价
2015/03/05 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
婚庆答谢词大全
2015/09/29 职场文书
学校运动会开幕词
2016/03/03 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android