其他的设计模式传送门:
【设计模式】适配器模式 告别接口难题,让你的代码更兼容,让你的接口不再孤单,解锁接口兼容新境界,让你的代码变得更灵活!-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