代码
基于Qt5.9-mingw32编译
#include <QCoreApplication>
#include <QList>
#include <QDebug>
///观察者模式的例子--ssshhhaaaooo20180910
///观察者模式的基本用途是用于多个对象(观察者)监视某个对象(被观察者)的变化,并各自作出自己的反应
//观察者的抽象类(接口),所有观察者都继承这个类进行观察。
//下面这个是标准抽象类写法,所有成员函数均为public权限的纯虚函数(派生类需要实现每一个纯虚函数),
//子类继承后改为protected权限,这样
//实际调用者调用的是抽象类的该函数,然后基类去找到派生类的该函数进行调用。
//抽象类的构造函数为protected权限提醒禁止实例化,派生类需要派生继承
//析构函数为虚函数,派生类不需要派生继承,这样在析构派生类时会自动调用基类进行析构
//构建观察者接口
class obsever
{
protected:
obsever() {}
public:
virtual ~obsever() {}
virtual void observe(QString str) = 0;
};
//构建观察者1类
class person1: public obsever
{
public:
person1(): obsever() {}
~person1() {}
protected:
virtual void observe(QString str);
};
//观察者1类的观察行为
void person1::observe(QString str)
{
qDebug() << "person1 got a " << str;
}
//构建观察者2类
class person2: public obsever
{
public:
person2(): obsever() {}
~person2() {}
protected:
virtual void observe(QString str);
};
//观察者2类的观察行为
void person2::observe(QString str)
{
qDebug() << "person2 got a " << str;
}
//构建被观察者类
class actor
{
private:
QList<obsever*> list;//用于存放被注册的观察者
public:
void addList(obsever *obe);
void sendMessage(QString str);
};
//注册观察者
void actor::addList(obsever *obe)
{
list.append(obe);
}
//发出消息令观察者进行观察
void actor::sendMessage(QString str)
{
foreach (obsever *obe, list)
{
obe->observe(str);
}
}
int main(int, char **)
{
///观察者模式测试
actor m_actor;
obsever *m_person1 = new person1;
obsever *m_person2 = new person2;
m_actor.addList(m_person1);
m_actor.addList(m_person2);
m_actor.sendMessage("hello world!");
qDebug() << "\r\n";
getchar();
delete m_person1;
delete m_person2;
}