观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖它的对象都会自动收到通知并更新。
在Qt框架中,观察者模式被广泛应用,其中最常见的应用场景是信号与槽(Signals and Slots)。信号与槽机制允许对象之间通过信号和槽(函数)来进行通信,使得对象之间的解耦更加简单和灵活。
下面是一个使用观察者模式的代码示例:
#include <QCoreApplication>
#include <QDebug>
// 观察者接口
class Observer
{
public:
virtual void update(int value) = 0;
};
// 具体观察者A
class ConcreteObserverA : public Observer
{
public:
void update(int value) override
{
qDebug() << "ConcreteObserverA: value is" << value;
}
};
// 具体观察者B
class ConcreteObserverB : public Observer
{
public:
void update(int value) override
{
qDebug() << "ConcreteObserverB: value is" << value;
}
};
// 被观察者
class Observable
{
private:
QList<Observer*> observers;
public:
void addObserver(Observer* observer)
{
observers.append(observer);
}
void removeObserver(Observer* observer)
{
observers.removeOne(observer);
}
void notifyObservers(int value)
{
for (Observer* observer : observers)
{
observer->update(value);
}
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Observable observable;
ConcreteObserverA observerA;
ConcreteObserverB observerB;
observable.addObserver(&observerA);
observable.addObserver(&observerB);
observable.notifyObservers(42);
return a.exec();
}
在这个例子中,Observable
是被观察者类,Observer
是观察者接口。ConcreteObserverA
和ConcreteObserverB
是具体的观察者类,它们实现了观察者接口。当被观察者的状态发生改变时,它会通知所有注册的观察者,观察者接收到通知后会执行相应的更新操作。
运行上述代码,输出会是:
ConcreteObserverA: value is 42
ConcreteObserverB: value is 42
可以看到,当被观察者通知观察者发生了改变时,所有的观察者都会收到通知并更新自己的状态。