模式定义
代理模式(Proxy Pattern)是一种结构型设计模式,通过引入代理对象控制对真实对象的访问。代理在客户端和真实对象之间充当中间层,常用于权限控制、延迟加载或远程访问等场景。
模式结构
抽象主题(Subject):定义真实对象和代理的公共接口(如数控系统的操作接口)。
真实主题(RealSubject):实现核心功能(如数控机床的实际操作)。
代理(Proxy):持有真实主题的引用,控制访问并添加额外逻辑(如权限校验)。
适用场景
控制敏感操作权限(如数控系统的启动需验证用户身份)。
实现延迟加载(如仅在需要时初始化高开销对象)。
远程服务调用(如通过网络代理访问数控设备)。
C++示例(数控系统场景)
场景说明:
数控系统需要控制机床的启动权限,只有授权用户才能执行启动操作。
#include
#include
#include
// 抽象主题:机床操作接口
class MachineSystem {
public:
virtual ~MachineSystem() = default;
virtual void start() = 0;
};
// 真实主题:数控机床实现
class CNCMachine : public MachineSystem {
public:
void start() override {
std::cout << "数控机床启动:开始加工零件..." << std::endl;
}
};
// 代理:权限控制代理
class MachineProxy : public MachineSystem {
private:
std::unique_ptr realMachine;
std::string username;
std::string password;
public:
MachineProxy(const std::string& user, const std::string& pwd)
: username(user), password(pwd) {
realMachine = std::make_unique();
}
void start() override {
if (authenticate()) {
realMachine->start();
} else {
throw std::runtime_error("权限不足:启动被拒绝");
}
}
private:
bool authenticate() {
// 模拟权限验证(实际可能连接数据库或LDAP)
return (username == "admin" && password == "admin123");
}
};
// 客户端
int main() {
try {
// 用户通过代理访问数控机床
std::unique_ptr proxy =
std::make_unique("admin", "admin123");
proxy->start(); // 成功启动
// 非法用户尝试
std::unique_ptr invalidProxy =
std::make_unique("guest", "123");
invalidProxy->start(); // 抛出异常
} catch (const std::exception& e) {
std::cerr << "错误: " << e.what() << std::endl;
}
return 0;
}
代码解析
抽象主题 MachineSystem
定义机床操作的统一接口。
真实主题 CNCMachine
实现实际的启动逻辑。
代理类 MachineProxy
在调用 start()
前执行权限验证,控制对真实对象的访问。
模式优势
权限隔离:保护真实对象不被非法访问(如数控系统的敏感操作)。
职责分离:代理类处理非核心逻辑(如日志、验证),真实主题专注业务。