用PHP的反射实现委托模式
2012-01-22 00:00
501 查看
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。
动态委托的介绍:动态委托概念来自于Jakarta 字节码工程库 (Byte-Code Engineering Library, BCEL)。它能够分析存在的类,并且对于接口,抽象类,甚至运行时的具体类来说,它能够生成以字节编码委托类。
被委托的接口/类应该满足如下条件:动态委托最多只能委托一个类,但是能够代理多个接口。这个限制来自于Java的单继承模式。一个Java类最多只有一个父类。既然生成的委托类把被委托类作为它的父类,那么指定多个被委托类是不合理的。如果没有指定被委托类,那么缺省的父类就是Object。
下面是PHP 反射机制实现动态代理的代码:
可见,通过代理类FruitDelegator来代替Fruit类来实现他的方法。
同样的,如下的代码也是能够运行的:
动态委托的介绍:动态委托概念来自于Jakarta 字节码工程库 (Byte-Code Engineering Library, BCEL)。它能够分析存在的类,并且对于接口,抽象类,甚至运行时的具体类来说,它能够生成以字节编码委托类。
被委托的接口/类应该满足如下条件:动态委托最多只能委托一个类,但是能够代理多个接口。这个限制来自于Java的单继承模式。一个Java类最多只有一个父类。既然生成的委托类把被委托类作为它的父类,那么指定多个被委托类是不合理的。如果没有指定被委托类,那么缺省的父类就是Object。
下面是PHP 反射机制实现动态代理的代码:
<?php class Fruit { function callFruit() { print "Generate an Apple"; } } class FruitDelegator { private $targets; function __construct() { $this->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类来实现他的方法。
同样的,如下的代码也是能够运行的:
<?php class Color { function callColor() { print "Generate Red"; } } class ColorDelegator { private $targets; function addObject($obj) { $this->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(); ?>
相关文章推荐
- 用PHP的反射实现委托模式
- 利用php反射机制实现动态代理模式
- php 反射机制实现代理模式
- 工厂模式实现方式、使用场景(包括基于反射的简单工厂模式)
- PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!
- PHP实现的策略模式简单示例
- 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
- PHP版23种设计模式简单的实现
- PHP中数据库单例模式的实现代码分享
- 组合模式和php实现
- 使用委托和事件实现观察者模式(Observer Pattern)
- php中实现3DES算法(ECB加密模式PKCS5Padding填充)
- SqlHelper简单实现(通过Expression和反射)6.Providor模式(工厂+策略)可配置数据库选择
- PHP实现单件模式的几种方式
- java内省机制与反射实现工厂模式
- thinkphp nginx实现url pathinfo模式并隐藏url index.php
- php利用反射真正实现多继承(非接口模拟)
- PHP单例模式实现数据库连接
- 使用反射+缓存+委托,实现一个不同对象之间同名同类型属性值的快速拷贝
- PHP 反射机制详解 以及插件架构实现