用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中的串行化变量和序列化对象
Sep 05 PHP
sphinx增量索引的一个问题
Jun 14 PHP
PHP的魔术常量__METHOD__简介
Jul 08 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
PHP读取汉字的点阵数据
Jun 22 PHP
PHP常用的小程序代码段
Nov 14 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
Mar 14 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 PHP
php无限级分类实现方法分析
Oct 19 PHP
php preg_match的匹配不同国家语言实例
Dec 29 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 多行多列显示
2009/08/15 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
python中redis的安装和使用
2016/12/04 Python
python使用opencv读取图片的实例
2017/08/17 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
几道PHP面试题
2013/04/14 面试题
什么造成了Java里面的异常
2016/04/24 面试题
四种会话跟踪技术
2015/05/20 面试题
大学生职业生涯十年规划书范文
2014/09/17 职场文书
2014教师教育实践活动对照检查材料思想汇报
2014/09/21 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android