代理模式
# 分类
结构型模式
# 定义
代理模式(Proxy Pattern) 在代理模式中,一个类代表另一个类的功能。我们创建具有现有对象的对象,以便向外界提供功能接口。
代理模式分为
- 远程代理 :也就是为一个对象在不同的地址空间提供全局代表,这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理 :是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
- 安全代理 : 用来控制真实对象访问时的权限。
- 智能指引 :是指当调用真实对象时,代理处理另一些事情。
# 意图
代理模式为其他对象提供一种代理,以控制这个对象的访问。
# 应用场景
- 安职责来划分,通常有以下使用场景:
- 远程代理
- 虚拟代理
- 保护代理
- Cache代理
- 防火墙代理
- 同步化代理
- 智能引用代理
应用实例
- 猪八戒去找高翠兰结果是孙悟空变的。
- 买火车票不一定在火车站买,也可以去代售点买。
- 一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。
# 角色与结构图
- Subject:
抽象主题角色
定义一个接口。 - RealSubject:
真实主题角色
实现抽象主题角色的接口。 - Proxy:
代理角色
使用实际角色完成相关功能。 - Client:
客户程序角色
使用代理实现相关功能。
下图解释了代理模式中各角色的作用

# 示例代码
//抽象请求者
abstract class Subject{
public abstract void Request();
}
//实际请求者
class RealSubject : subject{
public override void Request(){
Console.WriteLine("真实的请求");
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
//代理
class Proxy : subject{
RealSubject realSubject;
public override void Request(){
if(realSubject == null){
realSubject = new RealSubject();
}
realSubject.request();
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
//客户端
class Client{
static void Main(String[] args){
Proxy proxy = new Proxy();
proxy.Request();
Console.Read();
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 优点
- 职责清晰。
- 高扩展性。
- 智能化。
# 缺点
- 由于在客户端和真实主题之间增加了代理对象,因此有些类的代理模式可能会造成请求的处理变慢。
- 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
# 小结
- 主要解决?在直接访问对象时带来的问题,比如说:要访问的对象在远程机器上,在面向对象系统中,有些对象由于某些原因,直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
- 何时使用?想在访问一个类时做一些控制。
- 如何解决?增加中间层。
- 关键代码?实现与被代理类组合。
注意
- 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所处理类的接口。
- 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
# 大结
直接与间接,人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活、满足特定需求的解决方案。 动机:在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。 如何在不失去透明操作对象的同时来管理/控制这些特有的复杂性,增加一层间接层是软件开发中常见的解决方案。 意图:为其他对象提供一种代理以控制对这个对象的访问。
# 一句话概括
为对象提供一个代理以便控制这个对象的访问。
编辑 (opens new window)
上次更新: 2025/03/22, 13:47:44