用PHP的反射实现委托模式
来源:互联网 发布:js弹窗广告代码 编辑:程序博客网 时间:2024/05/29 15:06
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。
动态委托的介绍:动态委托概念来自于Jakarta 字节码工程库 (Byte-Code Engineering Library, BCEL)。它能够分析存在的类,并且对于接口,抽象类,甚至运行时的具体类来说,它能够生成以字节编码委托类。
被委托的接口/类应该满足如下条件:动态委托最多只能委托一个类,但是能够代理多个接口。这个限制来自于Java的单继承模式。一个Java类最多只有一个父类。既然生成的委托类把被委托类作为它的父类,那么指定多个被委托类是不合理的。如果没有指定被委托类,那么缺省的父类就是Object。
下面是PHP 反射机制实现动态代理的代码:
01
<?php
02
class
Fruit
03
{
04
function
callFruit()
05
{
06
print
"Generate an Apple"
;
07
}
08
}
09
class
FruitDelegator
10
{
11
private
$targets
;
12
13
function
__construct()
14
{
15
$this
->target[] =
new
Fruit();
16
}
17
18
function
__call(
$name
,
$args
)
19
{
20
foreach
(
$this
->target
as
$obj
)
21
{
22
$r
=
new
ReflectionClass(
$obj
);
23
if
(
$method
=
$r
->getMethod(
$name
))
24
{
25
if
(
$method
->isPublic() && !
$method
->isAbstract())
26
{
27
return
$method
->invoke(
$obj
,
$args
);
28
}
29
}
30
}
31
}
32
}
33
$obj
=
new
FruitDelegator();
34
$obj
->callFruit();
35
// 运行结果
36
// Generate an Apple
37
?>
可见,通过代理类FruitDelegator来代替Fruit类来实现他的方法。
同样的,如下的代码也是能够运行的:
01
<?php
02
class
Color
03
{
04
function
callColor()
05
{
06
print
"Generate Red"
;
07
}
08
}
09
class
ColorDelegator
10
{
11
private
$targets
;
12
13
function
addObject(
$obj
)
14
{
15
$this
->target[] =
$obj
;
16
}
17
18
function
__call(
$name
,
$args
)
19
{
20
foreach
(
$this
->target
as
$obj
)
21
{
22
$r
=
new
ReflectionClass(
$obj
);
23
if
(
$method
=
$r
->getMethod(
$name
))
24
{
25
if
(
$method
->isPublic() && !
$method
->isAbstract())
26
{
27
return
$method
->invoke(
$obj
,
$args
);
28
}
29
}
30
}
31
}
32
}
33
$obj
=
new
ColorDelegator();
34
$obj
->addObject(
new
Color());
35
$obj
->callColor();
36
?>
0 0
- 用PHP的反射实现委托模式
- 委托和反射的实现
- Java 利用反射实现C#的委托
- 反射委托事件实现
- 简单的用反射实现工厂模式
- php 反射机制实现代理模式
- 使用反射实现Java下的委托机制
- php核心学习-设计模式的学习-委托模式
- 用Java动态代理实现委托模式
- 用java语言实现事件委托模式
- 用java语言实现事件委托模式
- 用Java动态代理实现委托模式
- 用java语言实现事件委托模式
- 用java语言实现事件委托模式
- 用java语言实现事件委托模式
- 用Java语言实现事件委托模式
- 用java语言实现事件委托模式
- 用java语言实现事件委托模式
- IDEA12 android连接真实机
- Minimum Inversion Number(线段树)
- php 安装扩展
- hdu 1050 Moving Tables
- C++中const用法浅析
- 用PHP的反射实现委托模式
- html 特殊符号
- LeetCode | Unique Paths(唯一路径)
- 关于补码运算原理
- uploadify3.2 jquery上传组件
- simple-spring-memcached-3.0.x 注解详解
- centos-6.4 64位u盘安装盘制作
- 五子棋C++代码
- NYOJ27,水池数目