序言
还是参考的菜鸟教程,会C++的还是看C++的方式来得舒服。
环境
Qt5.12 C++
理解
使用符合UML规范的便于理解和回忆
观察者保存观察对象的指针,便于随时获取观察对象的数据,同时存在update函数用于通知更改了数据。
被观察者用容器保存观察者的数据,在更新数据时遍历容器调用update函数通知了更新。
.
源码
observer.h
#ifndef OBSERVER_H
#define OBSERVER_H
#include <QDebug>
#include <QList>
class Subject;
/**
* @brief 抽象类,使其自有指向观察者
*/
class Observer
{
public:
explicit Observer();
virtual ~Observer();
/**
* @brief 表示观察的内容更新后观察者所需要做的处理
*/
virtual void update() = 0;
protected:
/**
* @brief 观察主题
*/
Subject *subject;
};
/**
* @brief 第一个观察者
*/
class FirstObserver : public Observer
{
public:
/**
* @brief 构造第一个观察者,并将观察的主题保存到继承的成员变量里
* @param 观察的主题
*/
explicit FirstObserver(Subject *subject);
void update() override;
};
/**
* @brief 第二个观察者
*/
class SecondObserver : public Observer
{
public:
/**
* @brief 构造第二个观察者,并将观察的主题保存到继承的成员变量里
* @param 观察的主题
*/
explicit SecondObserver(Subject *subject);
void update() override;
};
/**
* @brief 第三个观察者
*/
class ThirdObserver : public Observer
{
public:
/**
* @brief 构造第三个观察者,并将观察的主题保存到继承的成员变量里
* @param 观察的主题
*/
explicit ThirdObserver(Subject *subject);
void update() override;
};
/**
* @brief 观察主题
*/
class Subject
{
public:
explicit Subject();
/**
* @brief 返回观察的内容
* @return 观察内容
*/
int getState();
/**
* @brief 设置观察的内容
* @param 观察内容
*/
void setState(int state);
/**
* @brief 保存一个观察自己的观察者地址
* @param 观察者
*/
void attach(Observer *observer);
/**
* @brief 通知每一个观察者名单上的观察者自己更新了
*/
void notifyAllObservers();
private:
/**
* @brief observers保存了每一个观察了Subject的观察者名单
*/
QList< Observer * > observers;
/**
* @brief state为观察内容,可以换其他类型的
*/
int state;
};
#endif // OBSERVER_H
.
observer.cpp
#include "observer.h"
Observer::Observer()
{
}
Observer::~Observer()
{
}
FirstObserver::FirstObserver(Subject *subject)
{
this->subject = subject;
this->subject->attach(this);
}
void FirstObserver::update()
{
qDebug() << "FirstObserver Update" << subject->getState();
}
SecondObserver::SecondObserver(Subject *subject)
{
this->subject = subject;
this->subject->attach(this);
}
void SecondObserver::update()
{
qDebug() << "SecondObserver Update" << subject->getState();
}
ThirdObserver::ThirdObserver(Subject *subject)
{
this->subject = subject;
this->subject->attach(this);
}
void ThirdObserver::update()
{
qDebug() << "ThirdObserver Update" << subject->getState();
}
Subject::Subject()
{
}
int Subject::getState()
{
return state;
}
void Subject::setState(int state)
{
this->state = state;
notifyAllObservers();
}
void Subject::attach(Observer *observer)
{
observers.append(observer);
}
void Subject::notifyAllObservers()
{
for (auto observer : observers)
{
observer->update();
}
}
.
使用的地方
//只是单纯的演示,正式使用时,并非一定要用智能指针
QSharedPointer< Subject > subject(new Subject);
FirstObserver first(subject.data());
SecondObserver second(subject.data());
ThirdObserver third(subject.data());
subject->setState(15); //每次设置值时都会遍历更新一次
subject->setState(20);