高端网站开发有哪些,品牌策划的七个步骤,增城微网站建设,网站的关键词排名怎么做链接#xff1a;C 设计模式 链接#xff1a;C 设计模式 - 门面模式 链接#xff1a;C 设计模式 - 中介者 链接#xff1a;C 设计模式 - 适配器
代理模式#xff08;Proxy Pattern#xff09;是一种结构型设计模式#xff0c;它为其他对象提供一种代理以控制#xff08…链接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_uniqueRealSensor();}realSensor_-readData();}private:std::unique_ptrRealSensor realSensor_;
};3.4.客户端代码
int main() {std::unique_ptrSensor sensor std::make_uniqueProxySensor();// 传感器尚未初始化std::cout Sensor not initialized yet. std::endl;// 第一次读取传感器数据传感器将被初始化sensor-readData();// 第二次读取传感器数据传感器不需要再次初始化sensor-readData();return 0;
}