代理模式代理商盈利模式
一、作用
代理模式,也称为委托模式,作用就是找一个对象来替我们访问某个对象;
意图:为其它对象提供一种代理以控制对这个对象的访问;
代理模式就像我们生活中有些不方便自己直接出面处理的事情,然后找一个中间人替我们去处理;
例如:我们来到一个新的城市,需要租房,但是你又不知道哪里有好的房源,所以你找到了中介,去帮你找好的房源;
那么你就是下图中的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)
当一个对象被引用时,提供一些额外的操作(例如:将对象被调用的次数记录下来)。