【C++】—— 代理模式

简介: 【C++】—— 代理模式



(一)什么是代理模式

代理模式指代理控制对其他对象的访问,也就是代理对象控制对原对象的引⽤。在某些情况下,⼀个对象不适合或者不能直接被引⽤访问,⽽代理对象可以在客⼾端和⽬标对象之间起到中介的作⽤。


(二)为什么使用代理模式

  1. 增加额外功能:在不修改真实对象代码的前提下,可以通过代理在访问真实对象时添加额外的功能,如缓存、日志记录、延迟加载、性能监测等。
  2. 接口隔离:如果某个对象的接口过于复杂或不希望暴露给客户端,可以使用代理模式提供一个简单的接口进行访问,从而隔离复杂性。
  3. 智能引用:代理可以控制对象的生命周期,实现智能指针的功能,比如引用计数,自动释放不再使用的对象等。

代理模式的作用: 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;
}

 


(五)代理模式优缺点

优点:

  1. 代理模式可以控制对真实对象的访问,实现权限控制,保护真实对象的安全性。
  2. 高扩展性:具体主题角色可变。

缺点:

  1. 引入代理模式会增加系统的复杂性,在访问真实对象时,代理会增加一层间接调用,可能会导致性能开销。
  2. 如果系统中存在大量的真实对象,可能会导致代理类的数量过多,增加系统的复杂性和维护成本。
相关文章
|
7月前
结构型 代理模式
结构型 代理模式
41 0
|
2月前
|
设计模式 缓存 C#
C# 一分钟浅谈:装饰者模式与代理模式
【10月更文挑战第12天】本文介绍了面向对象编程中的两种常见设计模式:装饰者模式和代理模式。装饰者模式允许在运行时动态地给对象添加功能,而代理模式则通过代理对象控制对另一个对象的访问。文章详细讲解了这两种模式的概念、常见问题、如何避免问题以及代码示例,帮助读者更好地理解和应用这些设计模式。
40 13
|
5月前
|
设计模式
对于装饰器模式与代理模式的个人理解
摘要: 代理模式与装饰器模式虽相似,但目的不同。装饰器动态增强对象功能,如添加新特性,而不改变原有类。代理模式则用于控制访问,如优化昂贵操作或添加辅助服务(如日志),它可能在内部初始化原对象。用法上,装饰器由外部决定是否应用,允许链式创建,而代理通常内部调用,外部直接与代理交互,被代理对象可能独立不可用。
|
7月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
代理模式——为他人做嫁衣裳
代理模式——为他人做嫁衣裳
|
7月前
|
设计模式 Java
代理模式与动态代理
代理模式与动态代理
44 0
|
7月前
|
Java Spring
代理模式
代理模式
55 0
|
Java 网络安全 Maven
代理模式的运用
代理模式的运用
58 0
|
设计模式 JavaScript
关于代理模式我所知道的
关于代理模式我所知道的
82 0
|
Java Spring
代理模式你了解多少
代理模式你了解多少
78 0