一、作用
代理模式,也称为委托模式,作用就是找一个对象来替我们访问某个对象;
意图:为其它对象提供一种代理以控制对这个对象的访问;
代理模式就像我们生活中有些不方便自己直接出面处理的事情,然后找一个中间人替我们去处理;
例如:我们来到一个新的城市,需要租房,但是你又不知道哪里有好的房源,所以你找到了中介,去帮你找好的房源;
那么你就是下图中的RealSubject,中介就是Proxy,Request()就是租房
二、UML类图
- Subject:抽象主题角色,定义Proxy和RealSubject的共用接口,这样就可以在任何使用RealSubject的地方,都可以使用Proxy;
- RealSubject:具体主题角色,被代理角色,真实处理业务的角色,是业务逻辑的具体执行者;
- Proxy:代理主题角色,代理角色,保存一个引用使得代理可以访问实体;
三、代码实现
#include <iostream>
#include <string>
using namespace std;
//Subject
class Subject
{
public:
virtual void Request() = 0;
};
//RealSubject
class RealSubject :public Subject
{
public:
void Request()
{
cout << "小明需要租一间房子!" << endl;
}
};
//Proxy
class Proxy :public Subject
{
public:
Proxy (Subject* subject) :m_subject(subject){}
void Request()
{
m_Person->Request();
cout << "中介抽取佣金百分之10!" << endl;
}
private:
Subject* m_subject;
};
//场景
int main()
{
//小明
Subject *xiaoM = new RealSubject;
//找一个中介帮忙租房子
Subject *intermediary = new Proxy(xiaoM);
intermediary->Request();
return 0;
}
结果:
小明需要租一间房子!
中介抽取佣金百分之10!
请按任意键继续. . .
四、优缺点
优点:
- 职责清晰。代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;
- 高扩展性。可以灵活隐藏被代理对象的部分功能和服务,更可灵活增加额外的功能和服务。
缺点:
- 由于客户端与真实主题间增加了代理对象,故有些类型的代理模式可能导致请求处理的速度变慢;
- 实现代理模式需要额外的工作,有些代理模式实现起来比较复杂。
五、适用场景
根据目的和实现方式的不同,代理模式可分为很多种,常见的有:
- 远程代理(Remote Proxy)
为一个位于不同地址空间的对象提供一个本地代理,对代理的方法调用会导致对远程对象的方法调用。ATM 就是一个例子,ATM 可能会持有(存在于远程服务器中的)银行信息的一个代理对象。 - 虚拟代理(Virtual Proxy)
使用虚拟代理,代理可以作为一个(资源消耗较大的)对象的代表。虚拟代理经常延迟对象的创建,直到需要为止。在创建对象之前(及创建对象过程中),虚拟代理也可以作为对象的代理;之后,代理将请求直接委托给 RealSubject。 - 保护代理(Protection Proxy)
根据访问权限,可以使用保护代理来控制对资源的访问。例如,有一个员工对象,保护代理可以允许普通员工调用对象的某些方法,管理员调用其他方法。 - 缓冲代理(Cache Proxy)
为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。 - 智能引用代理(Smart Reference Proxy)
当一个对象被引用时,提供一些额外的操作(例如:将对象被调用的次数记录下来)。