观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象(被观察者,Subject)的状态发生改变时,所有依赖于它的对象(观察者,Observer)都会得到通知并自动更新。这种模式通常用于实现事件处理系统、GUI更新、订阅-发布模型等场景。
在C++中实现观察者模式的基本结构包括以下几个部分:1. 抽象主题(Subject)接口:定义了添加观察者、移除观察者和通知观察者的方法。 cpp class ISubject { public: virtual ~ISubject() {} virtual void attach(IObserver* observer) = 0; virtual void detach(IObserver* observer) = 0; virtual void notify() = 0; };
2. 抽象观察者(Observer)接口:定义了当观察者接收到更新通知时应执行的操作。 cpp class IObserver { public: virtual ~IObserver() {} virtual void update(float price) = 0; // 示例中的更新方法,具体参数根据需求调整 };
3. 具体主题(ConcreteSubject)类:维护状态并负责在状态变化时通知观察者。 cpp class ConcreteSubject : public ISubject { private: std::list<IObserver*> m_observers; float m_fPrice; public: ConcreteSubject() : m_fPrice(0) {} void attach(IObserver* observer) override { m_observers.push_back(observer); } void detach(IObserver* observer) override { m_observers.remove(observer); } void notify() override { for(auto observer : m_observers) { observer->update(m_fPrice); } } void setPrice(float price) { m_fPrice = price; notify(); // 状态改变时通知观察者 } };
4. 具体观察者(ConcreteObserver)类:实现观察者接口,定义具体响应更新的行为。 cpp class ConcreteObserver : public IObserver { public: void update(float price) override { std::cout << "Observer received update: New price is " << price << std::endl; // 实际操作,如更新UI、记录日志等 } };
使用观察者模式的场景示例:- 当某个传感器(ConcreteSubject)数据更新时,需要通知所有注册的监控应用(ConcreteObserver)更新显示。- 在一个实时股票报价系统中,股票价格变动(ConcreteSubject)时,需要实时推送给多个订阅者(ConcreteObserver)。观察者模式的优点包括:- 松耦合:观察者和被观察者之间仅通过接口关联,降低了模块间的耦合度,提高了系统的可维护性和扩展性。- 灵活性和可重用性:容易增加新的观察者和被观察者,不影响现有代码。- 支持广播通信:一个主题可以轻松地向多个观察者广播信息。不过,观察者模式也存在一些缺点,比如观察者数量过多时可能导致性能问题,以及观察者和被观察者之间的循环引用可能引起内存泄漏。在实际应用中,需要根据具体需求权衡利弊。