代理模式

概念

代理模式是一种结构型模式,它可以为其他对象提供一种代理以控制对这个对象的访问

主要角色

  • 抽象主题角色(Subject):它的作用是统一接口。此角色定义了真实主题角色和代理主题角色共用的接口,这样就可以在使用真实主题角色的地方使用代理主题角色。
  • 真实主题角色(RealSubject):隐藏在代理角色后面的真实对象。
  • 代理主题角色(ProxySubject):它的作用是代理真实主题,在其内部保留了对真实主题角色的引用。它与真实主题角色都继承自抽象主题角色,保持接口的统一。它可以控制对真实主题的存取,并可能负责创建和删除真实对象。代理角色并不是简单的转发,通常在将调用传递给真实对象之前或之后执行某些操作,当然你也可以只是简单的转发。 与适配器模式相比:适配器模式是为了改变对象的接口,而代理模式并不能改变所代理对象的接口

代码实现

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
/**
* Created by PhpStorm.
* User: Livfer
* Desc:
* Date: 2019/10/22
* Time: 17:29
*/

/**
* 抽象主题角色 定义了真正主题角色和代理的公用接口
* Interface ProxySubject
*/
interface ProxySubject
{
public function say();

public function run();
}

/**
* 真正主题角色 定义了代理所代表的真实实体
* Class RealSubject
*/
class RealSubject implements ProxySubject
{
private $name;

public function __construct($name)
{
$this->name = $name;
}


public function say()
{
// TODO: Implement say() method.
echo $this->name."在说话";
}

public function run()
{
// TODO: Implement run() method.
echo $this->name."在跑步";
}
}

/**
* Proxy对象 暴露给客户端的对象,客户并不知道到底使用的是哪个真实角色
* Class Proxy
*/
class Proxy implements ProxySubject
{
private $realSubject;

public function __construct(RealSubject $realSubject)
{
$this->realSubject = $realSubject;
}

public function say()
{
// TODO: Implement say() method.
$this->realSubject->say();
}

public function run()
{
// TODO: Implement run() method.
$this->realSubject->run();
}
}

$realSubject = new RealSubject('张三');
$proxy = new Proxy($realSubject);
$proxy->say(); //张三在说话
$proxy->run(); //张三在跑步

参考

设计模式详解及PHP实现