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.

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部