用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 file_exists 检查文件或目录是否存在的函数
May 10 PHP
用PHP实现递归循环每一个目录
Aug 08 PHP
PHP中simplexml_load_string函数使用说明
Jan 01 PHP
PHP中调用ASP.NET的WebService的代码
Apr 22 PHP
php中随机显示图片的函数代码
Jun 23 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
利用PHP实现图片等比例放大和缩小的方法详解
Jun 06 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
PHP Class&Object -- 解析PHP实现二叉树
Jun 25 PHP
php中简单的对称加密算法实现
Jan 05 PHP
PHP实现的curl批量请求操作示例
Jun 06 PHP
基于PHP实现发微博动态代码实例
Dec 11 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
解析PHP工厂模式的好处
2013/06/18 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
PHP生成唯一订单号
2015/07/05 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
PHP-FPM的配置与优化讲解
2019/03/15 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
jquery制作 随机弹跳的小球特效
2015/02/01 Javascript
详解JavaScript正则表达式之分组匹配及反向引用
2016/03/09 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
微信小程序 获取二维码实例详解
2017/06/23 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
python学生信息管理系统(完整版)
2020/04/05 Python
python mysql断开重连的实现方法
2019/07/26 Python
Python列表的切片实例讲解
2019/08/20 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
MySQL面试题目集锦
2016/04/14 面试题
培训主管岗位职责
2014/02/01 职场文书
销售经理工作职责
2014/02/03 职场文书
自动一体化专业求职信
2014/03/15 职场文书
如何写股份合作协议书
2014/09/11 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
python glom模块的使用简介
2021/04/13 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
php双向队列实例讲解
2021/11/17 PHP