观察者模式的含义
观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系,使得每当一个对象改变状态时,其所有依赖者都会收到通知并自动更新。观察者模式经常用于实现分布式事件处理系统,其中一个对象的行为依赖于另一个对象的状态。
核心思想及解释
观察者模式的核心思想是解耦观察者和被观察者。在这种模式中,被观察者(通常称为“主题”或“发布者”)持有一系列依赖于它的观察者(“订阅者”),并在状态改变时主动通知它们,调用各观察者的更新方法。这使得观察者和被观察者之间实现了抽象的耦合设计,而不是具体的耦合。
为什么要使用观察者模式
- 支持广播通信:观察者模式支持广播行为,无需关心具体的观察者数量和类型。
- 动态订阅和退订:观察者可以根据需要随时开始订阅或停止订阅更新。
- 应用解耦:发布者不需要知道观察者的具体实现细节,只需知道它实现了观察者接口。
使用观察者模式需要注意的点
- 避免循环引用:确保清理工作得当,以免产生内存泄露或循环引用问题。
- 更新操作的性能问题:如果观察者响应更新操作需要大量计算,可能会影响整体性能。
- 通知顺序:系统设计需要考虑观察者接收通知的顺序,尤其是在观察者响应中可能影响其他观察者状态时。
工程的应用场景
- GUI组件:如按钮点击、滑块移动等GUI事件的响应。
- 网络状态监听:应用程序需要响应网络状态改变,如在线或离线模式切换。
- 股票或游戏得分更新:多个客户端需要实时更新状态信息。
示例代码及解释
假设我们正在开发一个简单的股票价格更新系统,其中StockTicker
是被观察者,发布股票价格更新,而多个观察者订阅这些更新。
首先定义观察者接口和被观察者类:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
class Observer
{
public:
virtual void update(const std::string& message) = 0;
virtual ~Observer() {}
};
class StockTicker
{
std::vector<Observer*> observers;
public:
void attach(Observer* obs)
{
observers.push_back(obs);
}
void detach(Observer* obs)
{
observers.erase(std::remove(observers.begin(), observers.end(), obs), observers.end());
}
void notify(const std::string& message)
{
for (Observer* obs : observers)
{
obs->update(message);
}
}
void newPriceUpdate(const std::string& stock, double price)
{
notify("Price updated - " + stock + ": $" + std::to_string(price));
}
};
定义具体的观察者:
class Investor : public Observer
{
std::string name;
public:
Investor(const std::string& name) : name(name) {}
void update(const std::string& message) override
{
std::cout << name << " received: " << message << std::endl;
}
};
客户端代码如下:
int main() {
StockTicker ticker;
Investor alice("Alice");
Investor bob("Bob");
ticker.attach(&alice);
ticker.attach(&bob);
ticker.newPriceUpdate("AAPL", 150.50);
ticker.newPriceUpdate("GOOGL", 2729.34);
ticker.detach(&alice);
ticker.newPriceUpdate("AAPL", 151.45);
return 0;
}
输出代码运行结果
Alice received: Price updated - AAPL: $150.5
Bob received: Price updated - AAPL: $150.5
Alice received: Price updated - GOOGL: $2729.34
Bob received: Price updated - GOOGL: $2729.34
Bob received: Price updated - AAPL: $151.45
这个示例展示了观察者模式的实际应用。StockTicker
作为被观察者,当股票价格更新时,它通知所有订阅了这一更新的观察者。观察者Investor
接收到更新信息后做出响应。当我们从通知列表中移除Alice
后,她就不再接收更新,显示了动态订阅/退订的功能。