观察者模式,也叫做发步-订阅模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,
这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己
举一个公司工作的例子,例子中秘书和boss充当观察者,通知员工们开始工作的更新!
#ifndef OBSERVER
#define OBSERVER
#include <QtDebug>
#include <QString>
#include <QSharedPointer>
#include "subject.h"
class Observer
{
public:
// Observer(){}
Observer(QString name, Subject *sub):_name(name),_sub(QSharedPointer<Subject>(sub)){}
virtual ~Observer(){}
virtual void update()=0;
protected:
QString _name;
QSharedPointer<Subject> _sub;
};
class StockObserver final:public Observer
{
public:
StockObserver(QString name, Subject *sub):Observer(name, sub){}
void update() override
{
qDebug() <<_sub->getSubjectState()<<_name<<"关掉股票,开始工作!";
}
};
class AnimationObserver final:public Observer
{
public:
AnimationObserver(QString name, Subject *sub):Observer(name, sub){}
void update() override
{
qDebug() <<_sub->getSubjectState()<<_name<<"关掉动漫,开始工作!";
}
};
#endif // OBSERVER
#ifndef SUBJECT
#define SUBJECT
#include <QtDebug>
#include <QString>
#include <QList>
class Observer;
class Subject
{
public:
// Subject(){}
virtual ~Subject()
{
#if 1
qDeleteAll(_observers);
#else
for(auto i:_observers)
{
delete i;
}
#endif
_observers.clear();
}
virtual void Attach(Observer *observer) = 0;
virtual void Detch(Observer *observer) = 0;
virtual void Notify() = 0;
// void setSubjectState(QString str){_action = str;}
QString getSubjectState(){return _action;}
protected:
QString _action;
QList<Observer *> _observers;
};
class Boss:public Subject
{
public:
Boss(){Subject::_action = QString::fromUtf8("I am boss!");}
void Attach(Observer *observer) override
{
_observers.append(observer);
}
void Detch(Observer *observer) override
{
_observers.removeOne(observer);
delete observer;
observer = nullptr;
}
void Notify() override; //override不能写在类外面!!
};
class Secretary:public Subject
{
public:
Secretary(){Subject::_action = QString("I am secretary!");} //子类为啥不能初始化父类的成员变量
void Attach(Observer *observer) override
{
_observers.append(observer);
}
void Detch(Observer *observer) override
{
_observers.removeOne(observer);
delete observer;
observer = nullptr;
}
void Notify() override; //override不能写在类外面!!
};
#endif // SUBJECT
#include "subject.h"
#include "observer.h"
void Boss::Notify()
{
for( auto i:_observers)
{
i->update();
}
}
void Secretary::Notify()
{
for( auto i:_observers)
{
i->update();
}
}
#include "observer.h"
#include "subject.h"
int main(int argc, char * argv[])
{
Subject *st = new Secretary();
Observer *a = new StockObserver("妈妈",st);
Observer *b = new AnimationObserver("小东",st);
st->Attach(a);
st->Attach(b);
st->Detch(b);
st->Notify();
return 0;
}
这个例子通过观察者员工们的状态,同时在构造观察者的时候可以设置观察者的状态,达到了观察者模式的效果。
最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/notifyStock_observer_pattern_14