用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 无限分类三种方式 非函数的递归调用!
Aug 26 PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 PHP
分享一个php 的异常处理程序
Jun 22 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
PHP制作万年历
Jan 07 PHP
PHP 反射(Reflection)使用实例
May 12 PHP
php文件读取方法实例分析
Jun 20 PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 PHP
laravel 如何实现引入自己的函数或类库
Oct 15 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的宝库目录--PEAR
2006/10/09 PHP
基于PHP输出缓存(output_buffering)的深入理解
2013/06/13 PHP
ThinkPHP3.1新特性之多层MVC的支持
2014/06/19 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
Vue DevTools调试工具的使用
2017/12/05 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
Python判断字符串与大小写转换
2015/06/08 Python
python中偏函数partial用法实例分析
2015/07/08 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
中专生自我鉴定
2013/12/17 职场文书
怎样写好自荐信和推荐信
2013/12/26 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
培训协议书范本
2014/04/22 职场文书
新学期开学演讲稿
2014/05/24 职场文书
公共场所标语
2014/06/30 职场文书
体育专业求职信
2014/07/16 职场文书
长城导游词
2015/01/30 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
深入理解 Golang 的字符串
2022/05/04 Golang