php设计模式_代理模式

代理模式(Proxy Pattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做 Proxy 或 Surrogate,它是一种对象结构型模式。

代理模式有三个关键要素,它们分别是:

  • 主题(Subject):定义“操作/活动/任务”的接口类。
  • 真实主题(RealSubject):真正完成“操作/活动/任务”的具体类。
  • 代理主题(ProxySubject):代替真实主题完成“操作/活动/任务”的代理类。
代理模式的优点
  • 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
  • 可以灵活地隐藏被代理对象的部分功能和服务,也增加额外的功能和服务。

代理模式的缺点

  • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
  • 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

场景

  • 不想或者不能直接引用一个对象时
  • 想对一个对象的功能进行加强时
  • 各种特殊用途的代理:远程代理、虚拟代理、保护(Protect or Access)代理、Cache 代理等

图示

php设计模式_代理模式

代码实现

静态代理
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
interface TicketSell
{
public function buyTicket($handle);
}

class Station implements TicketSell
{
public function buyTicket($handle)
{
echo $handle;
}
}

class proxyStation implements TicketSell
{
//设置库存
private static $stock = 1;
private $station;

public function __construct()
{
$this->station = new Station();
}

public function buyTicket($hanle)
{
if (self::$stock > 0) {
$this->station->buyTicket($hanle);
self::$stock--;
} else {
echo '余票不足';
}
}
}
$ticketSell = new proxyStation();
$ticketSell->buyTicket('买票');
$ticketSell->buyTicket('买票');
动态代理
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
interface TicketSell
{
public function buyTicket($handle);
}

class Station implements TicketSell
{
public function buyTicket($handle)
{
echo $handle[0];
}
}
class proxyStation
{
private $target = array();
private static $stock = 1;

public function __construct($station)
{
$this->target[] = new $station;
}

public function __call($name, $args)
{
if (self::$stock > 0) {
foreach ($this->target as $obj) {
$r = new ReflectionClass($obj);
$method = $r->getMethod($name);
if ($method->isPublic() && !$method->isAbstract()) {
$method->invoke($obj, $args);
}
self::$stock--;
}
} else {
echo '余票不足';
}
}
}
$ticketSell = new proxyStation('Station');
$ticketSell->buyTicket('买票');
$ticketSell->buyTicket('买票');
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!