用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 相关文章推荐
留言板翻页的实现详解
Oct 09 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
PHP Session机制简介及用法
Aug 19 PHP
CI框架中cookie的操作方法分析
Dec 12 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 PHP
php使用Jpgraph创建3D饼形图效果示例
Feb 15 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
PHP实现的抓取小说网站内容功能示例
Jun 27 PHP
PHP设计模式(观察者模式)
Jul 07 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
Zend公司全球首推PHP认证
2006/10/09 PHP
PHP入门
2006/10/09 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
Python字符串格式化输出方法分析
2016/04/13 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
Python AES加密实例解析
2018/01/18 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
荷兰本土平价百货:HEMA
2017/10/23 全球购物
求职信格式范本
2013/11/15 职场文书
创业计划书中包含的9个方面
2013/12/26 职场文书
校庆接待方案
2014/03/18 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
党的作风建设心得体会
2014/10/22 职场文书
太空授课观后感
2015/06/17 职场文书
小学生读书笔记
2015/07/01 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA