用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+MYSQL的文章管理系统(二)
Oct 09 PHP
php批量删除数据
Jan 18 PHP
php下用cookie统计用户访问网页次数的代码
May 09 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
PHP中遇到的时区问题解决方法
Jul 23 PHP
JSON字符串传到后台PHP处理问题的解决方法
Jun 05 PHP
Laravel实现表单提交
May 07 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
PHP实现根据数组某个键值大小进行排序的方法
Mar 13 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
PHP使用PDO 连接与连接管理操作实例分析
Apr 21 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
Terran兵种对照表
2020/03/14 星际争霸
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
node+koa实现数据mock接口的方法
2017/09/20 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
在Django中使用Sitemap的方法讲解
2015/07/22 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
Python os.access()用法实例
2019/02/18 Python
python二进制文件的转译详解
2019/07/03 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
python能否java成为主流语言吗
2020/06/22 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
护士自我鉴定
2013/10/23 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
离婚协议书范本2014
2014/10/27 职场文书
部门经理助理岗位职责
2015/04/13 职场文书
冬季作息时间调整通知
2015/04/24 职场文书