概念
允许定义一种订阅机制,可在对象事件发生时通知多个“观察”该对象的其他对象。
代码示例
//观察者接口
class IObserver
{
public:
virtual ~IObserver() {}
virtual void update() = 0; //有更新时执行的函数
protected:
IObserver(){}
};
//具体观察者
class Observer : public IObserver
{
public:
Observer(){}
~Observer(){}
void update()
{
qDebug() << "观察到更新了,执行若干操作";
}
};
//观察的对象
class ISubject
{
public:
virtual ~ISubject(){}
virtual void add(IObserver *pObserver) = 0;
virtual void remove(IObserver *pObserver) = 0;
virtual void notify() = 0; //通知
protected:
ISubject() {}
};
class Subject : public ISubject
{
public:
Subject(){}
~Subject(){}
virtual void add(IObserver *pObserver)
{
observerList.push_back(pObserver);
}
virtual void remove(IObserver *pObserver)
{
observerList.removeOne(pObserver);
}
virtual void notify() //通知观察者并更新
{
for (auto iter = observerList.begin(); iter != observerList.end(); ++iter)
{
(*iter)->update();
}
}
void setState(int state)
{
m_state = state;
}
private:
QList<IObserver *> observerList;
int m_state; //状态值,如果发生改变,表示状态改变了,需要通知观察者并更新
};
int main(int argc, char *argv[])
{
Subject *subject = new Subject();
Observer *oberver1 = new Observer();
subject->setState(1); //状态第一次发生改变
subject->add(oberver1); //添加/注册观察者
subject->notify();//发布消息通知
subject->setState(2); //状态第二次发生改变
subject->notify();
return 0;
}