从零开始最简单Qt/C++设计模式总结一:观察者模式

代码

基于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;
}

结果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/sssaaaannnddd/article/details/82595325