代理模式 (Proxy Pattern)

代理模式 (Proxy Pattern)

意图:为其他对象提供一种代理以控制对这个对象的访问。

基础组件
  • Subject (主题接口):定义RealSubject和Proxy的公共接口
  • RealSubject (真实主题):定义Proxy所代表的实体
  • Proxy (代理):保存一个引用使得代理可以访问实体
继承/实现关系
Subject <|-- RealSubject
Subject <|-- Proxy
Proxy --> RealSubject (组合关系)
应用场景
  • 远程代理:为不同地址空间的对象提供代理
  • 虚拟代理:根据需要创建开销大的对象
  • 保护代理:控制对原始对象的访问权限
  • 智能引用:在访问对象时执行附加操作
C++ 实现(敏感文件访问控制)
#include <iostream>
#include <string>
#include <memory>

/*
* 代理模式
* 意图:为其他对象提供一种代理以控制对这个对象的访问。
* 基础组件:
* - Subject (主题接口):定义RealSubject和Proxy的公共接口
* - RealSubject (真实主题):定义Proxy所代表的实体
* - Proxy (代理):保存一个引用使得代理可以访问实体
* 继承/实现关系:
* RealSubject和Proxy都实现了Subject接口。
* Proxy持有RealSubject的引用,并在需要时调用其方法。
* 
* 代理模式与装饰器模式的区别:
* 代理模式通常在代理类中创建被代理的对象(或者由外部传入),而装饰器模式通常由外部传入被装饰对象(然后层层包装)。
* 代理模式:"控制访问" - 我是对象的门卫,决定你是否能访问以及如何访问
* 装饰器模式:"增强功能" - 我是对象的装扮师,给它穿上各种功能外衣
*/

// 主题接口:文件访问
class FileAccess {
public:
    virtual void readFile(const std::string& filename) = 0;
    virtual ~FileAccess() = default;
};

// 真实主题:文件系统访问
class RealFileAccess : public FileAccess {
public:
    void readFile(const std::string& filename) override {
        std::cout << "Reading file: " << filename << "\n";
        // 实际文件读取操作
    }
};

// 代理:访问控制代理(通过继承接口并保存一个真实主题的引用来实现)
class AccessControlProxy : public FileAccess {
public:
    AccessControlProxy(const std::string& user) : user_(user) {}

    void readFile(const std::string& filename) override {
        if (checkAccess()) {
            // 延迟初始化真实对象
            if (!realAccess_) {
                realAccess_ = std::make_unique<RealFileAccess>();
            }
            realAccess_->readFile(filename);
        }
        else {
            std::cout << "Access denied to " << user_ << " for file " << filename << "\n";
        }
    }

private:
    bool checkAccess() const {
        // 简单的访问控制逻辑
        return user_ == "admin";
    }

    std::string user_;
    std::unique_ptr<FileAccess> realAccess_;
};

void ProxyPattern()
{
	std::cout << std::string(13, '-') << " Proxy Pattern " << std::string(13, '-') << "\n";

	// 创建代理对象
	AccessControlProxy adminProxy("admin");
	adminProxy.readFile("secret.txt");  // 允许访问

	AccessControlProxy guestProxy("guest");
	guestProxy.readFile("secret.txt");  // 拒绝访问

	RealFileAccess publicAccess;
	publicAccess.readFile("public.txt");  // 直接访问真实对象,不受代理控制
}
组件对应关系
  • FileAccess → 主题接口
  • RealFileAccess → 真实主题
  • AccessControlProxy → 代理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值