网站首页原型图咋做,一般做企业网站需要什么资料,外贸做网站的好处,北京网站建设软件设计模式-07 设计模式-观察者模式#xff08;Observer Pattern#xff09; 1.定义 观察者模式是一种软件设计模式#xff0c;它定义了一种一对多的依赖关系#xff0c;其中一个对象#xff08;称为“主题”#xff09;维护了一个依赖对象的列表#xff08;称为“观察者”…设计模式-07 设计模式-观察者模式Observer Pattern 1.定义 观察者模式是一种软件设计模式它定义了一种一对多的依赖关系其中一个对象称为“主题”维护了一个依赖对象的列表称为“观察者”并且当主题的状态发生变化时它会自动通知所有观察者。 2.内涵
换句话说观察者模式允许对象订阅其他对象并接收有关其状态更改的通知。主题对象负责管理观察者列表并通知它们任何状态更改。
涉及到的相关术语
主题Subject维护观察者列表并通知它们状态更改的对象。观察者Observer订阅主题并接收有关其状态更改的通知的对象。具体主题Concrete Subject实现主题接口并维护具体状态和观察者列表的类。具体观察者Concrete Observer实现观察者接口并定义对主题状态更改的响应的类。 工作原理,当观察者模式使用时
观察者向主题注册表示他们有兴趣接收状态更改通知。主题维护一个观察者列表其中包含所有已注册的观察者。当主题的状态发生变化时它会遍历观察者列表并调用每个观察者的 update() 方法。观察者收到通知并相应地更新自己的状态。
3.使用案例
#include iostream
#include vector// Observer interface
class Observer {
public:virtual void update(float temperature, float humidity, float pressure) 0;
};// Subject (WeatherStation) class
class WeatherStation {
private:float temperature;float humidity;float pressure;std::vectorObserver* observers;public:void registerObserver(Observer* observer) {observers.push_back(observer);}void removeObserver(Observer* observer) {// You can implement the removal logic if needed.}void notifyObservers() {for (Observer* observer : observers) {observer-update(temperature, humidity, pressure);}}void setMeasurements(float temp, float hum, float press) {temperature temp;humidity hum;pressure press;notifyObservers();}
};// Concrete Observer
class Display : public Observer {
public:void update(float temperature, float humidity, float pressure) {std::cout Display: Temperature temperature °C, Humidity humidity %, Pressure pressure hPa std::endl;}
};int main() {WeatherStation weatherStation;// Create displaysDisplay display1;Display display2;// Register displays as observersweatherStation.registerObserver(display1);weatherStation.registerObserver(display2);// Simulate weather data updatesweatherStation.setMeasurements(25.5, 60, 1013.2);weatherStation.setMeasurements(24.8, 58, 1014.5);return 0;
} 4.注意事项
观察者模式的优点包括
松散耦合观察者和主题是松散耦合的这意味着它们可以独立更改而不会影响彼此。可扩展性可以轻松地向系统中添加或删除观察者而不会影响主题或其他观察者。可重用性观察者模式可以轻松地应用于不同的应用程序和领域。
观察者模式的缺点包括
性能开销当主题的状态经常更改时通知所有观察者可能会产生性能开销。通知顺序观察者模式不保证观察者将按特定顺序收到通知。内存占用如果有很多观察者订阅主题主题需要维护一个很大的观察者列表这可能会导致内存占用增加。 5.最佳实践
使用接口而不是具体类主题和观察者接口应该用于定义主题和观察者之间的关系而不是使用具体类。这提高了代码的可重用性和灵活性。使用弱引用观察者应该使用弱引用持有对主题的引用。这可以防止循环引用并允许在观察者不再需要时自动释放它们。考虑使用事件对象事件对象可以用来封装状态更改通知。这可以提供更丰富的通知其中包含有关状态更改的附加信息。使用主题层次结构当需要对不同类型的状态更改进行更精细的控制时可以使用主题层次结构。这允许观察者只订阅他们感兴趣的特定状态更改。 使用观察者模式需要考虑优化通知性能如果主题的状态经常更改可以使用以下技术来优化通知性能
使用位掩码或标志来跟踪已更改的状态方面。批量处理观察者通知。使用异步通知机制例如消息队列。使用线程安全如果主题或观察者可能从多个线程访问则需要使用线程安全技术例如互斥锁或原子操作。考虑使用第三方库有许多第三方库提供了观察者模式的实现可以简化其在应用程序中的使用。 6.总结 仅在需要时使用观察者模式。它可能会引入一些开销和复杂性。心中明白清楚地定义观察者订阅和取消订阅的机制。考虑使用观察者模式的变体例如发布/订阅模式或模型-视图-控制器 (MVC) 模式。在设计观察者模式时牢记 SOLID 原则单一职责、开放/封闭、里氏替换、接口隔离和依赖反转。