用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 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
个人站长制做网页常用的php代码
Mar 03 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
Jul 01 PHP
PHP获取文件的MD5值并判断是否被修改的例子
Jun 19 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
laravel安装和配置教程
Oct 29 PHP
php计算数组相同值出现次数的代码(array_count_values)
Jan 20 PHP
PHP获取ip对应地区和使用网络类型的方法
Mar 11 PHP
PHP微信支付实例解析
Jul 22 PHP
php将文件夹打包成zip文件的简单实现方法
Oct 04 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 PHP
TP5框架简单登录功能实现方法示例
Oct 31 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
ThinkPHP中的关联模型注意点
2014/06/16 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
Python中map和列表推导效率比较实例分析
2015/06/17 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
详解Python实现进度条的4种方式
2020/01/15 Python
Python内存映射文件读写方式
2020/04/24 Python
win10安装python3.6的常见问题
2020/07/01 Python
Python 如何在字符串中插入变量
2020/08/01 Python
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
大学军训通讯稿
2014/01/13 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
店长岗位职责
2015/02/11 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
2016年记者节感言
2015/12/08 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle