观察者模式(Observer):观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
下面是观察者模式的UML图:
下面是C++实现的代码:
/*
* initm.com
* 作者:Stupid
* 时间:2017-10-27 23:12
* 描述: 代码使用QT5.9+MinGW53_32编译通过,代码为观察者模式的基本结构代码。
*/
#include <QCoreApplication>
#include <cstdlib>
#include <iostream>
#include <string>
#include <list>
class Observer
{
public:
virtual void Update()=0;
};
class Subject
{
private:
std::list<Observer*> observers;
public:
void Attach(Observer* const& observer){
observers.push_back(observer);
}
void Detach(Observer* const& observer){
observers.remove(observer);
}
void Notify(){
for(auto index: observers){
index->Update();
}
}
};
class ConcreteSubject: public Subject
{
private:
std::string subjectState;
public:
std::string GetSubjectState(){
return subjectState;
}
void SetSubjectState(const std::string& subjectState){
this->subjectState = subjectState;
}
};
class ConcreteObserver: public Observer
{
private:
ConcreteSubject* subject;
std::string name;
std::string observerState;
public:
ConcreteObserver(ConcreteSubject* subject, const std::string name):
name(name){
this->subject = subject;
}
void Update()override final{
observerState = subject->GetSubjectState();
std::cout << "观察者" << name << "的新状态:" << observerState << std::endl;
}
ConcreteSubject* GetSubject(){
return subject;
}
void SetSubject(ConcreteSubject*& subject){
this->subject = subject;
}
};
int main(int argc, char *argv[])
{
system("chcp 65001 > n");
QCoreApplication a(argc, argv);
ConcreteSubject* concreteSubject = new ConcreteSubject;
concreteSubject->Attach(new ConcreteObserver(concreteSubject, std::string("X")));
concreteSubject->Attach(new ConcreteObserver(concreteSubject, std::string("Y")));
concreteSubject->Attach(new ConcreteObserver(concreteSubject, std::string("Z")));
concreteSubject->SetSubjectState("维护");
concreteSubject->Notify();
return a.exec();
}
ConcreteObserver是具体被通知的类型,每次ConcreteSubject的状态发生变化,都会通知到每一个注册的ConcreteObserver

