观察者模式适用于GUI事件处理、消息队列、发布订阅系统、游戏开发等场景,通过解耦实现一对多状态同步;其与发布-订阅模式区别在于同步 vs 异步、直接依赖 vs 中间解耦。

观察者模式是一种行为设计模式,用于在对象之间建立一种一对多的依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都会收到通知并自动更新。核心在于解耦,让被观察者和观察者之间的联系更加松散。
#include #include class Observer {public: virtual void update(int state) = 0;};class Subject {public: virtual void attach(Observer* observer) = 0; virtual void detach(Observer* observer) = 0; virtual void notify() = 0;};class ConcreteSubject : public Subject {private: std::vector observers; int state;public: void attach(Observer* observer) override { observers.push_back(observer); } void detach(Observer* observer) override { for (auto it = observers.begin(); it != observers.end(); ++it) { if (*it == observer) { observers.erase(it); return; } } } void notify() override { for (Observer* observer : observers) { observer->update(state); } } void setState(int state) { this->state = state; notify(); } int getState() { return state; }};class ConcreteObserver : public Observer {private: ConcreteSubject* subject; int observerState;public: ConcreteObserver(ConcreteSubject* subject) : subject(subject) {} void update(int state) override { observerState = state; std::cout << "Observer state updated to: " << observerState <attach(observer1); subject->attach(observer2); subject->setState(10); subject->setState(20); subject->detach(observer1); subject->setState(30); delete observer1; delete observer2; delete subject; return 0;}
观察者模式在实际项目中的应用场景有哪些?
观察者模式在很多场景下都非常有用。比如,在GUI编程中,当用户点击一个按钮时,多个组件可能需要响应这个事件。再比如,在消息队列系统中,当有新消息到达时,多个消费者可能需要处理这个消息。 还可以用于实现发布-订阅系统,例如社交媒体中的关注和推送功能。甚至在游戏开发中,角色的状态变化需要通知UI进行更新,也常常使用观察者模式。总的来说,任何需要实现一对多依赖关系,并且希望解耦这些依赖关系的地方,都可以考虑使用观察者模式。
如何避免观察者模式中的循环依赖问题?
立即学习“C++免费学习笔记(深入)”;
循环依赖是一个需要注意的问题。例如,观察者A更新后通知被观察者B,被观察者B又通知观察者A,这样就形成了一个循环。解决这个问题的方法有很多。一种方法是在更新通知之前,设置一个标志位,表示当前正在更新,避免重复通知。另一种方法是使用更高级的消息队列,例如RabbitMQ或Kafka,它们可以处理复杂的依赖关系,并且可以避免循环依赖。此外,设计时可以考虑引入中间层,例如事件总线,来解耦观察者和被观察者之间的直接依赖关系。
观察者模式与发布-订阅模式有什么区别和联系?
观察者模式和发布-订阅模式经常被混淆,但它们之间还是有一些区别的。观察者模式通常是同步的,被观察者直接调用观察者的更新方法。而发布-订阅模式通常是异步的,发布者将消息发送到消息队列,订阅者从消息队列中获取消息。此外,观察者模式中,观察者通常知道被观察者的存在,而发布-订阅模式中,发布者和订阅者通常不知道彼此的存在,它们通过消息队列进行解耦。 观察者模式可以看作是发布-订阅模式的一个简化版本,更适用于对象之间存在直接依赖关系的情况。而发布-订阅模式更适用于大规模、分布式的系统,需要更高的灵活性和可扩展性。
以上就是如何在C++中实现一个观察者模式_C++观察者设计模式实现教程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1476288.html
微信扫一扫
支付宝扫一扫