用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 URL验证正则表达式
Jul 19 PHP
PHP中通过语义URL防止网站被攻击的方法分享
Sep 08 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
Jan 13 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
php实现统计目录文件大小的函数
Dec 25 PHP
CodeIgniter常用知识点小结
May 26 PHP
Yii2实现上下联动下拉框功能的方法
Aug 10 PHP
PHP+Ajax 检测网络是否正常实例详解
Dec 16 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
Aug 07 PHP
Laravel 加载第三方类库的方法
Apr 20 PHP
PHP读取目录树的实现方法分析
Mar 22 PHP
PHP实现简单日历类编写
Aug 28 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
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
如何真正的了解python装饰器
2020/08/14 Python
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
三年级数学教学反思
2014/01/31 职场文书
维稳工作情况汇报
2014/10/27 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
离婚民事起诉状
2015/08/03 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js