链接:C++ 设计模式
链接:C++ 设计模式 - 门面模式
链接:C++ 设计模式 - 中介者
链接:C++ 设计模式 - 适配器
代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。代理模式可以在不改变目标对象的情况下,通过代理对象来控制对目标对象的访问。
1.问题分析
在开发中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理、控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。
2.实现步骤
- 定义抽象主题接口:定义目标对象和代理对象的共同接口。
- 定义真实主题类:实现抽象主题接口,定义目标对象的具体行为。
- 定义代理类:实现抽象主题接口,包含对真实主题对象的引用,控制对真实主题对象的访问。
- 客户端代码:通过代理对象来访问目标对象的功能。
3.代码示例
假设传感器的初始化过程可能涉及复杂的硬件配置、校准、数据加载等操作,这些操作可能需要较长的时间。如果在系统启动时同步初始化所有传感器,可能会导致系统资源紧张,影响其他任务的执行。这可以采用延迟初始化的方式,来缓解对系统性能的影响。
3.1.定义抽象主题接口
class Sensor {
public:
virtual ~Sensor() = default;
virtual void readData() = 0;
};
3.2.定义真实主题类
class RealSensor : public Sensor {
public:
RealSensor() { initialize(); }
void readData() override { std::cout << "Reading sensor data..." << std::endl; }
private:
void initialize() {
std::cout << "Initializing sensor..." << std::endl;
// 模拟初始化开销
}
};
3.3.定义代理类
class ProxySensor : public Sensor {
public:
ProxySensor() : realSensor_(nullptr) {}
void readData() override {
if (!realSensor_) {
realSensor_ = std::make_unique<RealSensor>();
}
realSensor_->readData();
}
private:
std::unique_ptr<RealSensor> realSensor_;
};
3.4.客户端代码
int main() {
std::unique_ptr<Sensor> sensor = std::make_unique<ProxySensor>();
// 传感器尚未初始化
std::cout << "Sensor not initialized yet." << std::endl;
// 第一次读取传感器数据,传感器将被初始化
sensor->readData();
// 第二次读取传感器数据,传感器不需要再次初始化
sensor->readData();
return 0;
}