用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 验证图片生成函数
May 21 PHP
PHP 变量的定义方法
Jan 26 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
Jun 05 PHP
解析php中die(),exit(),return的区别
Jun 20 PHP
php数据库备份还原类分享
Mar 20 PHP
PHP获取音频文件的相关信息
Jun 22 PHP
php快速排序原理与实现方法分析
May 26 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
PHP实现按之字形顺序打印二叉树的方法
Jan 16 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
PHP 图片处理
Sep 16 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+MSSQL分页的例子
2006/10/09 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
PHP实现微信退款功能
2018/10/02 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
PHP多进程简单实例小结
2019/11/09 PHP
利用js对象弹出一个层
2008/03/26 Javascript
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
Vue使用localStorage存储数据的方法
2019/05/27 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
python抓取百度首页的方法
2015/05/19 Python
Python外星人入侵游戏编程完整版
2020/03/30 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
软件工程师面试题
2012/06/25 面试题
房屋改造计划书
2014/01/10 职场文书
演讲稿格式范文
2014/05/19 职场文书
志愿者个人总结
2015/03/03 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
企业安全生产检查制度
2015/08/06 职场文书
2016公司中秋节寄语
2015/12/07 职场文书