观察者模式(附C++代码示例)

观察者模式的含义

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系,使得每当一个对象改变状态时,其所有依赖者都会收到通知并自动更新。观察者模式经常用于实现分布式事件处理系统,其中一个对象的行为依赖于另一个对象的状态。

核心思想及解释

观察者模式的核心思想是解耦观察者和被观察者。在这种模式中,被观察者(通常称为“主题”或“发布者”)持有一系列依赖于它的观察者(“订阅者”),并在状态改变时主动通知它们,调用各观察者的更新方法。这使得观察者和被观察者之间实现了抽象的耦合设计,而不是具体的耦合。

为什么要使用观察者模式

  1. 支持广播通信:观察者模式支持广播行为,无需关心具体的观察者数量和类型。
  2. 动态订阅和退订:观察者可以根据需要随时开始订阅或停止订阅更新。
  3. 应用解耦:发布者不需要知道观察者的具体实现细节,只需知道它实现了观察者接口。

使用观察者模式需要注意的点

  1. 避免循环引用:确保清理工作得当,以免产生内存泄露或循环引用问题。
  2. 更新操作的性能问题:如果观察者响应更新操作需要大量计算,可能会影响整体性能。
  3. 通知顺序:系统设计需要考虑观察者接收通知的顺序,尤其是在观察者响应中可能影响其他观察者状态时。

工程的应用场景

  1. GUI组件:如按钮点击、滑块移动等GUI事件的响应。
  2. 网络状态监听:应用程序需要响应网络状态改变,如在线或离线模式切换。
  3. 股票或游戏得分更新:多个客户端需要实时更新状态信息。

示例代码及解释

假设我们正在开发一个简单的股票价格更新系统,其中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后,她就不再接收更新,显示了动态订阅/退订的功能。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warren++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值