欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 【设计模式之代理模式 -- C++】

【设计模式之代理模式 -- C++】

2025/9/15 22:30:25 来源:https://blog.csdn.net/qq_44628330/article/details/136002820  浏览:    关键词:【设计模式之代理模式 -- C++】

8.代理模式 – 控制访问,增强安全

所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网上连接、存储器中的大对象、文件或其它昂贵或无法复制的资源。百度百科

1)组成

抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

大白话就是:首先定义一个抽线角色用于作为代理和真实的几类;分别实现真实和代理角色类;在代理角色类中会定义一个真实类的对象;在代理类中,在相应的方法中调用真实类对象下的方法;

2)好处

1.用资源较小的对象代理资源消耗大的对象;
2.远程代理;
3.临时对象供多个用户访问时;

3) 使用场景
  1. 日志代理:在调用一个方法或者访问一个对象之前,记录下相关的信息,如方法名、参数、时间等。这在调试、性能测试和事务管理等场景中非常有用。在你的代码中,Proxy 类的 LogAccess 方法就是一个日志代理的例子。
  2. 缓存代理:为耗资源的运算结果提供临时存储,它在下次运算时,如果给定的参数相同,则直接返回已存储的结果。
  3. 远程代理:为在不同的地址空间的对象提供局部的代表,比如 web 服务或者云函数。
  4. 防火墙(保护)代理:控制资源的访问,保护主题免于“坏客户”的侵害。
  5. 智能引用代理:在访问对象时插入一些附加操作,比如计算一个对象被引用的次数。
  6. 虚拟代理:用于懒初始化,将一些开销大的操作延迟到真正需要的时候才执行。
  7. 只读代理:用于给对象的方法提供只读访问权限。
  8. 软件中:监控、统计、鉴权、限流、事务、幂等、日志等;
4)实现

1.定义一个基类

class Subject {
public:virtual void Request() = 0;
};

2.定义真实的类

class RealSubject : public Subject {
public:void Request() override {cout << "RealSubject: Handling request.\n";}
};

3.定义代理类

class Proxy : public Subject {
private:RealSubject *real_subject_;bool CheckAccess() {// 一些真实的检查cout << "Proxy: Checking access prior to firing a real request.\n";return true;}void LogAccess() {// 一些真实的日志记录cout << "Proxy: Logging the time of request.\n";}public:Proxy(RealSubject *real_subject) : real_subject_(new RealSubject(*real_subject)) {}~Proxy() {delete real_subject_;}void Request() override {if (this->CheckAccess()) {this->real_subject_->Request();this->LogAccess();}}
};

4.测试

int main() {cout << "Client: Executing the client code with a real subject:\n";RealSubject *real_subject = new RealSubject;real_subject->Request();cout << "\n";cout << "Client: Executing the same client code with a proxy:\n";Proxy *proxy = new Proxy(real_subject);proxy->Request();delete real_subject;delete proxy;return 0;
}

5.输出

Client: Executing the client code with a real subject:
RealSubject: Handling request.Client: Executing the same client code with a proxy:
Proxy: Checking access prior to firing a real request.
RealSubject: Handling request.
Proxy: Logging the time of request.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词