代理和动态代理

思考并回答以下问题:

静态代理

静态代理有一个最大的缺陷:接口与代理类是1对1的,有多个接口需要代理,就需要新建多个代理类,繁琐,类爆炸。每一个真实类都需要一个创建新的代理类。

透明代理:

动态代理

动态代理使用了反射,为了灵活稍稍牺牲一点性能。

PHP用反射实现动态代理

__call(),在对象中调用一个不可访问方法时调用。

该方法有两个参数,第一个参数$function_name会自动接收不存在的方法名,第二个$arguments则以数组的方式接收不存在方法的多个参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
class mysql
{
function connect($db)
{
echo "连接mysql数据库{$db[0]} \r\n";
}
}

class oracle
{
function connect($db)
{
echo "连接oracle数据库{$db[0]} \r\n";
}
}

class sqlproxy
{
private $target;
function __construct($tar)
{
$this->target[] = new $tar();
}

function __call($name,$args)
{
foreach ($this->target as $obj)
{
$r = new ReflectionClass($obj);
if($method = $r->getMethod($name))
{
if($method->isPublic() && !$method->isAbstract())
{
echo "method before record \r\n";
$method->invoke($obj,$args);
echo "method after record\r\n";
}
}
}
}
}

$mysql = new sqlproxy('mysql');
$mysql->connect('member');

$oracle = new sqlproxy('oracle');
$oracle->connect('member');

静态代理和动态代理的区别

•静态代理需要自己写代理类—>代理类需要实现与目标对象相同的接口

•而动态代理不需要自己编写代理类—->(是动态生成的)

使用静态代理时:

•如果目标对象的接口有很多方法的话,那我们还是得一一实现,这样就会比较麻烦

使用动态代理时:

•代理对象的生成,是利用JDKAPI,动态地在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型),并且会默认实现接口的全部方法。

动态代理就是拦截直接访问对象,可以给对象进行增强的一项技能。

总结

原有的对象需要额外的功能,想想动态代理这项技术!

0%