代理模式 (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→ 代理
224

被折叠的 条评论
为什么被折叠?



