【再谈观察者模式】观察者模式揭秘:打动你的C++ Qt世界!

其他的设计模式传送门:

【设计模式】适配器模式 告别接口难题,让你的代码更兼容,让你的接口不再孤单,解锁接口兼容新境界,让你的代码变得更灵活!-CSDN博客

 【高级感UP】掌握代理模式,编写优雅而高效的程序,C++实现代理模式揭秘,各种场景的示例代码-CSDN博客

【设计模式】原型模式详解,带你走进C++实现的精彩世界-CSDN博客

建造者模式详解:原理及示例代码、结构图、使用场景及优缺点-CSDN博客

 观察者模式(Observer Pattern)是一种常用的软件设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在本篇文章中,我们将通过一个简单的 Qt 场景来展示如何使用 C++ 实现观察者模式。

       其实Qt的信号槽底层实现也是使用观察者模式来实现的。假设我们正在开发一个简单的聊天应用程序,其中包含多个聊天窗口。当一个聊天窗口的消息发生变化时,其他聊天窗口应该能够自动更新显示最新的消息。这就是观察者模式的典型应用场景。

       首先,我们需要定义两个角色:Subject(主题)和 Observer(观察者)。在我们的示例中,聊天窗口就是主题,而其他聊天窗口则是观察者。Subject(主题)类负责管理观察者,并在状态发生变化时通知所有观察者。在我们的示例中,我们创建一个名为 ChatWindow 的类作为主题。

class ChatWindow {
public:
    void attach(Observer* observer) {
        m_observers.append(observer);
    }

    void detach(Observer* observer) {
        m_observers.removeOne(observer);
    }

    void notify() {
        for (Observer* observer : m_observers) {
            observer->update();
        }
    }

    void setMessage(const QString& message) {
        m_message = message;
        notify();
    }

    QString getMessage() const {
        return m_message;
    }

private:
    QList<Observer*> m_observers;
    QString m_message;
};

Observer(观察者)类定义了一个接口,用于在主题的状态发生变化时更新自身。在我们的示例中,我们创建一个名为 ChatWindowObserver 的类作为观察者。

class Observer{public:virtual void update() = 0;};

实现了 Observer 接口的 ChatWindowObserver 类将作为聊天窗口的观察者,它将负责更新自身的消息显示。

class ChatWindowObserver : public Observer {
public:
    ChatWindowObserver(ChatWindow* chatWindow) : m_chatWindow(chatWindow) {
        m_chatWindow->attach(this);
    }

    ~ChatWindowObserver() {
        m_chatWindow->detach(this);
    }

    void update() override {
        QString message = m_chatWindow->getMessage();
        // 更新聊天窗口的消息显示
        updateMessageDisplay(message);
    }

    void updateMessageDisplay(const QString& message) {
        // 更新消息显示
    }

private:
    ChatWindow* m_chatWindow;
};

现在,我们可以在 Qt 场景中使用这些类。假设我们有一个 MainWindow 类作为应用程序的主窗口,其中包含多个 ChatWindow 实例。

class MainWindow : public QMainWindow {
public:
    MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) {
        // 创建 ChatWindow 实例
        ChatWindow* chatWindow1 = new ChatWindow();
        ChatWindow* chatWindow2 = new ChatWindow();

        // 创建 ChatWindowObserver 实例并关联 ChatWindow
        ChatWindowObserver* observer1 = new ChatWindowObserver(chatWindow1);
        ChatWindowObserver* observer2 = new ChatWindowObserver(chatWindow2);

        // 设置消息并更新显示
        chatWindow1->setMessage("Hello, observer pattern!");
        chatWindow2->setMessage("Nice to meet you!");

        // ...
    }
};

在上面的示例中,创建了两个 ChatWindow 实例和两个 ChatWindowObserver 实例,并将观察者与主题关联起来。当我们设置聊天窗口的消息时,观察者会自动更新自身的消息显示。观察者模式是一种非常有用的设计模式,它可以帮助我们实现对象之间的松耦合,使得系统更易于扩展和维护。在本篇文章中,我们通过一个简单的 Qt 场景展示了如何在 C++ 中实现观察者模式。希望能对你理解观察者模式的实际应用有所帮助!

      如果还有更多好的想法,也可以在评论区留言哈。

     4                                                          
                                                            5    |-----|
              +---+                                             |     |
              |   |                                             |     |
              |   | 3                       3                   |     |
              |   |                                             |     |
              |   +---+                   -----                 |     |
              |       |                   |   |                 |     |    |----|3
            2 |       |                 2 |   |     2           |     |    |    |
              |       |                   |   |                 |     |    |    |
          +---+       |               ----+   |   +---+         |     |    |    |
          |           |               |       |   |   |         |     |    |    |
        1 |           | 1           1 |       | 1 |   | 1       |     |    |    |
          |           |               |       |   |   |         |     |    |    |
      +---+           +---+       +---+       +---+   +---+     |     |    |    |
      |                   |       |                       |     |     |    |    |
    0 |                   | 0   0 |                       | 0   |     |    |    |
      |                   |       |                       |     |     |    |    |
  +---+                   +-------+                       +---+ |     +--- |    |+
                                                                      
    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14   15  16  17  18

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五木大大

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

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

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

打赏作者

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

抵扣说明:

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

余额充值