用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 相关文章推荐
使用adodb lite解决问题
Dec 31 PHP
php不用正则采集速度探究总结
Mar 24 PHP
zend api扩展的php对象的autoload工具
Apr 18 PHP
PHP URL路由类实例
Nov 12 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 PHP
php 判断字符串中是否包含html标签
Feb 17 PHP
php使用正则过滤js脚本代码实例
May 10 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
php截取视频指定帧为图片
May 16 PHP
php实现的错误处理封装类实例
Jun 20 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 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使之能同时支持GIF和JPEG
2006/10/09 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
Python对列表排序的方法实例分析
2015/05/16 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
Python实现自动上京东抢手机
2018/02/06 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
python 标准差计算的实现(std)
2019/07/29 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
解决django 向mysql中写入中文字符出错的问题
2020/05/18 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
2021/02/01 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
员工培训心得体会
2013/12/30 职场文书
高中军训广播稿
2014/01/14 职场文书
股份转让协议书
2014/04/12 职场文书
暑假家长评语大全
2014/04/17 职场文书
英语复习计划
2015/01/19 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python