用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 相关文章推荐
PHP 选项及相关信息函数库
Dec 04 PHP
PHP操作xml代码
Jun 17 PHP
php利用单例模式实现日志处理类库
Feb 10 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
codeigniter自带数据库类使用方法说明
Mar 25 PHP
浅析PHP程序设计中的MVC编程思想
Jul 28 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 PHP
php通过function_exists检测函数是否存在的方法
Mar 18 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 PHP
PHP重定向与伪静态区别
Feb 19 PHP
laravel邮件发送的实现代码示例
Jan 31 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
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
11个PHPer必须要了解的编程规范
2014/09/22 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
JS获取checkbox的个数简单实例
2016/08/19 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
图文详解vue框架安装步骤
2019/02/12 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
在python中安装basemap的教程
2018/09/20 Python
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
汽车专业毕业生自荐信
2013/11/03 职场文书
数控专业推荐信范文
2013/12/02 职场文书
母亲节感恩活动记录
2014/03/16 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
售后服务承诺书模板
2014/05/21 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
房产公证书
2015/01/23 职场文书
2015年手术室工作总结
2015/05/11 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
小学教代会开幕词
2016/03/04 职场文书
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python