代理模式(Proxy)(Surrogate)
1.意图
为其他对象提供一种代理以控制对这个对象的访问。
2.适用性
在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用Proxy模式。下面是一些可以使用Proxy模式常见情况:
- 远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表。
- 虚代理(VirtualProxy)根据需要创建开销很大的对象。在动机一节描述的ImageProxy就是这样一种代理的例子。
- 保护代理(ProtectionProxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
- 智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。它的典型用途包括:
- 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它。
- 当第一次引用一个持久对象时,将它装入内存。
- 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
3.结构

这是运行时刻一种可能的代理结构的对象图。

4.代码
package proxy
/*
# 代理模式
代理模式用于延迟处理操作或者在进行实际操作前后进行其它处理。
## 代理模式的常见用法有
* 虚代理
* COW代理
* 远程代理
* 保护代理
* Cache 代理
* 防火墙代理
* 同步代理
* 智能指引
等。。。
*/
import "testing"
type Subject interface {
Do() string
}
type RealSubject struct{}
func (RealSubject) Do() string {
return "real"
}
type Proxy struct {
real RealSubject
}
func (p Proxy) Do() string {
var res string
// 在调用真实对象之前的工作,检查缓存,判断权限,实例化真实对象等。。
res += "pre:"
// 调用真实对象
res += p.real.Do()
// 调用之后的操作,如缓存结果,对结果进行处理等。。
res += ":after"
return res
}
func TestProxy(t *testing.T) {
var sub Subject
sub = &Proxy{}
res := sub.Do()
if res != "pre:real:after" {
t.Fail()
}
}
代理模式是一种设计模式,通过创建代理对象来控制对实际对象的访问,允许在调用实际操作前后的额外处理。常见应用场景包括远程代理、虚代理、保护代理和智能引用。本文通过代码示例展示了如何使用代理模式,如在调用真实对象前后添加额外的功能,例如缓存、权限检查或实例化控制。

2817

被折叠的 条评论
为什么被折叠?



