QT C++不使用信号槽,如何异步实现观察者模式
时间: 2024-01-28 10:02:51 浏览: 69
C++ 代码实现观察者模式
5星 · 资源好评率100%
在不使用信号槽的情况下,我们可以使用线程和回调函数来实现观察者模式的异步通信。
具体实现步骤如下:
1. 定义一个观察者类,其中包含一个回调函数指针,用于处理被观察者发出的事件。
2. 定义一个被观察者类,其中包含一个观察者的指针列表,以及一个通知观察者的函数。
3. 在被观察者类中,通知观察者时,使用线程来异步执行通知操作。
4. 在观察者类中,将自己的回调函数指针注册到被观察者的观察者指针列表中。
5. 当被观察者需要通知观察者时,遍历观察者指针列表,异步执行每个观察者的回调函数。
下面是一个简单的示例代码:
```
// 观察者类
class Observer
{
public:
virtual void handleMessage(const QString& message) = 0;
};
// 被观察者类
class Subject
{
public:
void addObserver(Observer* observer)
{
m_observers.append(observer);
}
void removeObserver(Observer* observer)
{
m_observers.removeOne(observer);
}
void sendMessage(const QString& message)
{
// 使用线程异步执行通知操作
QFuture<void> future = QtConcurrent::run([=]() {
for (Observer* observer : m_observers) {
observer->handleMessage(message);
}
});
}
private:
QList<Observer*> m_observers;
};
// 具体的观察者类
class ConcreteObserver : public Observer
{
public:
void handleMessage(const QString& message) override
{
qDebug() << "Received message: " << message;
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建观察者和被观察者对象
ConcreteObserver observer;
Subject subject;
// 注册观察者的回调函数到被观察者的观察者指针列表中
subject.addObserver(&observer);
// 发送消息
subject.sendMessage("Hello World!");
return a.exec();
}
```
在上面的示例代码中,当被观察者需要通知观察者时,使用线程异步执行通知操作,遍历观察者指针列表,异步执行每个观察者的回调函数。
阅读全文