Qt C++设计模式——观察者模式

史莱克学院中,大师带着其他人出去办事,学院只剩下柳二龙老师、唐三、小舞、戴沐白四人。

大师走之前交代第二天要柳二龙老师要叫其余三人起床修炼。那么会出现几种情况呢?

  • 柳二龙老师醒来正常叫三人修炼
  • 戴沐白让唐三叫自己起来修炼
  • 小舞想多休息一会儿,宠她的柳二龙老师便不叫她起床修炼

。。。。。。

以及还有更多的情况,那么我们如何用程序来模拟这个过程呢?

观察者模式——定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知。

依赖者对象也被称为观察者对象

在这个例子中,柳二龙老师就是主题对象,唐三、小舞、戴沐白就是观察者对象。柳二龙老师(主题对象)醒来时,她的状态便发生改变,同时通知其他三人(观察者对象)让他们起床。在观察者模式中,观察者对象也可以成为主题对象,所以戴沐白让唐三叫他起床时,唐三也成为了主题对象。

观察者对象需要注册到主题对象,主题对象在状态改变时才会通知观察者对象,否则将不会通知观察者对象。在本例中,小舞想多休息会儿,所以未注册到主题对象的观察者列表中,所以柳二龙老师不会叫醒她。

代码实现如下:

#ifndef OBSERVER_H
#define OBSERVER_H

#include <QDebug>
#include <stdio.h>

using namespace std;

//观察者
class Observer
{
public:
    Observer(){}
    ~Observer(){}

    virtual void update() = 0;//每个观察者必须实现本函数,来响应得到通知进行的操作
};

//主题对象
class Subjetct{

public:
    Subjetct(){}
    ~Subjetct(){}

    //注册观察者
    virtual void registerObserver(Observer *o) = 0;

    //删除观察者
    virtual void removeObserver(Observer *o) = 0;

    //状态改变时通知所有的观察者
    virtual void notifyObservers() = 0;

};

//柳二龙老师,单纯的主题对象
class LiuErLong:public Subjetct{

public:
    void registerObserver(Observer *o){
        m_lstObservers.push_back(o);
    }

    void removeObserver(Observer *o){
        if(m_lstObservers.size() > 0){
            m_lstObservers.remove(o);
        }
    }

    void notifyObservers(){
        foreach (Observer *o, m_lstObservers) {
            o->update();
        }
    }

    void wakeUp(){
        qDebug() << QStringLiteral("我是柳二龙!都给我起床了!");
        notifyObservers();
    }

private:
    list<Observer *> m_lstObservers;
};

//唐三,既是观察者也是主题对象
class TangSan:public Observer,public Subjetct{
public:
    void registerObserver(Observer *o){
        m_lstObservers.push_back(o);
    }

    void removeObserver(Observer *o){
        if(m_lstObservers.size() > 0){
            m_lstObservers.remove(o);
        }
    }

    void notifyObservers(){
        foreach (Observer *o, m_lstObservers) {
            o->update();
        }
    }

    void update(){
        qDebug() << QStringLiteral("我是唐三,我起来了,我叫沐白起床");
        notifyObservers();
    }

private:
    list<Observer *> m_lstObservers;
};

//戴沐白,单纯的观察者
class DaiMuBai:public Observer{
    void update(){
        qDebug() << QStringLiteral("我是戴沐白,我起来了");
    }
};

//小舞,单纯的观察者,且未注册进任何主题对象
class XiaoWu:public Observer{
    void update(){
        qDebug() << QStringLiteral("我是小舞,我起来了");
    }
};


#endif // OBSERVER_H

main.cpp:


#include <QApplication>
#include "observer.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    LiuErLong *Liu = new LiuErLong;
    TangSan *Tang = new TangSan;
    DaiMuBai *Dai = new DaiMuBai;
    XiaoWu *Wu = new XiaoWu;

    //大师安排的任务
    Liu->registerObserver(Tang);
    Liu->registerObserver(Dai);
    Liu->registerObserver(Wu);

    Liu->removeObserver(Dai);//戴沐白由唐三叫醒
    Liu->removeObserver(Wu);//柳二龙老师不忍心叫醒小舞

    Tang->registerObserver(Dai);//戴沐白让唐三叫醒自己

    Liu->wakeUp();

    return a.exec();
}

执行结果:

发布了28 篇原创文章 · 获赞 4 · 访问量 7390

猜你喜欢

转载自blog.csdn.net/JuicyActiveGilbert/article/details/100008356