(一)什么是代理模式
代理模式指代理控制对其他对象的访问,也就是代理对象控制对原对象的引⽤。在某些情况下,⼀个对象不适合或者不能直接被引⽤访问,⽽代理对象可以在客⼾端和⽬标对象之间起到中介的作⽤。
(二)为什么使用代理模式
- 增加额外功能:在不修改真实对象代码的前提下,可以通过代理在访问真实对象时添加额外的功能,如缓存、日志记录、延迟加载、性能监测等。
- 接口隔离:如果某个对象的接口过于复杂或不希望暴露给客户端,可以使用代理模式提供一个简单的接口进行访问,从而隔离复杂性。
- 智能引用:代理可以控制对象的生命周期,实现智能指针的功能,比如引用计数,自动释放不再使用的对象等。
代理模式的作用: AOP实现,拦截器,中介,黄牛,解耦,专人做专事。
- AOP:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一 种技术。
(三)代理模式实现步奏
代理模式的实现步骤如下:
- 提供一个抽象主题角色:真实主题与代理主题的共同接口
- 提供一个真实主题角色:定义了代理角色所代表的真实对象
- 提供一个代理主题角色:含有对真实主题角色的引用
【解释说明】
代理模式的结构包括⼀个是真正的你要访问的对象(⽬标类)、⼀个是代理对象。⽬标对象与代理对象实现同⼀个接⼝,先访问代理类再通过代理类访问⽬标对象。代理模式分为静态代理、动态代理:
- 静态代理指的是,在编译时就已经确定好了代理类和被代理类的关系。也就是说,在编译时就已经确定了代理类要代理的是哪个被代理类。
- 动态代理指的是,在运⾏时才动态⽣成代理类,并将其与被代理类绑定。这意味着,在运⾏时才能确定代理类要代理的是哪个被代理类。
(四)代码示例
场景:
- 以租房为例,房东将房⼦租出去,但是要租房⼦出去,需要发布招租启⽰,带⼈看房,负责维修,这些⼯作中有些操作并⾮房东能完成,因此房东为了图省事,将房⼦委托给中介进⾏租赁。
代理模式实现:
- 房东要把⼀个房⼦通过中介租出去理解代理模式
#include <iostream> #include <string> class RentHouse { public: virtual void rentHouse() = 0; };
- 房东类:将房⼦租出去
class Landlord : public RentHouse { public: void rentHouse() { std::cout << "将房⼦租出去\n"; } };
- 中介代理类:对租房⼦进⾏功能加强,实现租房以外的其他功能
class Intermediary : public RentHouse { public: void rentHouse() { std::cout << "发布招租启⽰\n"; std::cout << "带⼈看房\n"; _landlord.rentHouse(); std::cout << "负责租后维修\n"; } private: Landlord _landlord; };
主函数:
int main() { Intermediary intermediary; intermediary.rentHouse(); return 0; }
(五)代理模式优缺点
优点:
- 代理模式可以控制对真实对象的访问,实现权限控制,保护真实对象的安全性。
- 高扩展性:具体主题角色可变。
缺点:
- 引入代理模式会增加系统的复杂性,在访问真实对象时,代理会增加一层间接调用,可能会导致性能开销。
- 如果系统中存在大量的真实对象,可能会导致代理类的数量过多,增加系统的复杂性和维护成本。