百度小程序还需要做网站吗,怎么搞自己的网站,499可以做网站,搭建网站服务器需要什么配置链接#xff1a;C 设计模式 链接#xff1a;C 设计模式 - 模板方法 链接#xff1a;C 设计模式 - 策略模式
观察者模式#xff08;Observer Pattern#xff09;是一种行为设计模式#xff0c;它定义了一种一对多的依赖关系#xff0c;让多个观察者对象同时监听某一个主…链接C 设计模式 链接C 设计模式 - 模板方法 链接C 设计模式 - 策略模式
观察者模式Observer Pattern是一种行为设计模式它定义了一种一对多的依赖关系让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时它会通知所有观察者对象使它们能够自动更新。
1.问题分析
在开发中经常会遇到需要在一个对象状态变化时通知其他对象的情况。如果将通知逻辑直接嵌入到主题对象中会导致代码耦合度高难以维护和扩展。观察者模式通过将观察者对象和主题对象解耦使得它们可以独立变化。
2.实现步骤
定义观察者接口定义一个接口包含更新方法。定义主题接口定义一个接口包含注册、注销和通知观察者的方法。实现具体主题类具体主题类实现主题接口并维护一个观察者列表。实现具体观察者类具体观察者类实现观察者接口并在更新方法中实现具体的响应逻辑。
3.代码示例
以机器人电池电量作为示例
3.1.观察者接口
// 定义更新方法
class Observer {public:virtual ~Observer() default;virtual void update(int batteryLevel) 0;
};3.2. 主题接口
// 定义添加、删除和通知观察者的方法
class Subject {public:virtual ~Subject() default;virtual void addObserver(std::shared_ptrObserver observer) 0;virtual void removeObserver(std::shared_ptrObserver observer) 0;virtual void notifyObservers() 0;
};3.3.具体主题类
// 实现主题接口
class Robot : public Subject {public:void addObserver(std::shared_ptrObserver observer) override { observers.push_back(observer); }void removeObserver(std::shared_ptrObserver observer) override {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void notifyObservers() override {for (const auto observer : observers) {observer-update(batteryLevel);}}void setBatteryLevel(int level) {batteryLevel level;notifyObservers();}private:std::vectorstd::shared_ptrObserver observers;int batteryLevel 100;
};3.4.具体观察者类
// 具体观察者类1显示电池电量
class BatteryDisplay : public Observer {public:void update(int batteryLevel) override { std::cout BatteryDisplay: Battery level is batteryLevel % std::endl; }
};// 具体观察者类2当电池电量低于20%时发出警告
class BatteryWarning : public Observer {public:void update(int batteryLevel) override {if (batteryLevel 20) {std::cout BatteryWarning: Warning - Battery level low ( batteryLevel %) std::endl;}}
};3.5.调用算法
int main() {auto robot std::make_sharedRobot();auto batteryDisplay std::make_sharedBatteryDisplay();auto batteryWarning std::make_sharedBatteryWarning();robot-addObserver(batteryDisplay);robot-addObserver(batteryWarning);std::cout Setting battery level to 50% std::endl;robot-setBatteryLevel(50);std::cout \nSetting battery level to 15% std::endl;robot-setBatteryLevel(15);return 0;
}