设计模式学习(十三)————观察者模式

观察者模式,也叫做发步-订阅模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,

这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己
举一个公司工作的例子,例子中秘书和boss充当观察者,通知员工们开始工作的更新!

#ifndef OBSERVER
#define OBSERVER
#include <QtDebug>
#include <QString>
#include <QSharedPointer>
#include "subject.h"

class Observer
{
public:
//    Observer(){}
    Observer(QString name, Subject *sub):_name(name),_sub(QSharedPointer<Subject>(sub)){}
    virtual ~Observer(){}
    virtual void update()=0;
protected:
    QString _name;
    QSharedPointer<Subject> _sub;
};

class StockObserver final:public Observer
{
public:
    StockObserver(QString name, Subject *sub):Observer(name, sub){}
    void update() override
    {
        qDebug() <<_sub->getSubjectState()<<_name<<"关掉股票,开始工作!";
    }
};

class AnimationObserver final:public Observer
{
public:
    AnimationObserver(QString name, Subject *sub):Observer(name, sub){}
    void update() override
    {
        qDebug() <<_sub->getSubjectState()<<_name<<"关掉动漫,开始工作!";
    }
};
#endif // OBSERVER

#ifndef SUBJECT
#define SUBJECT
#include <QtDebug>
#include <QString>
#include <QList>

class Observer;
class Subject
{
public:
//    Subject(){}
    virtual ~Subject()
    {
#if 1
        qDeleteAll(_observers);
#else
        for(auto i:_observers)
        {            
            delete i;
        }
#endif
        _observers.clear();
    }
    virtual void Attach(Observer *observer) = 0;
    virtual void Detch(Observer *observer) = 0;
    virtual void Notify() = 0;
//    void setSubjectState(QString str){_action = str;}
    QString getSubjectState(){return _action;}
protected:
    QString _action;
    QList<Observer *> _observers;
};

class Boss:public Subject
{
public:
    Boss(){Subject::_action = QString::fromUtf8("I am boss!");}
    void Attach(Observer *observer) override
    {
        _observers.append(observer);
    }
    void Detch(Observer *observer) override
    {
        _observers.removeOne(observer);
        delete observer;
        observer = nullptr;
    }
    void Notify() override;  //override不能写在类外面!!
};

class Secretary:public Subject
{
public:
    Secretary(){Subject::_action = QString("I am secretary!");}   //子类为啥不能初始化父类的成员变量
    void Attach(Observer *observer) override
    {
        _observers.append(observer);
    }
    void Detch(Observer *observer) override
    {
        _observers.removeOne(observer);
        delete observer;
        observer = nullptr;
    }
    void Notify() override;  //override不能写在类外面!!
};

#endif // SUBJECT

#include "subject.h"
#include "observer.h"

void Boss::Notify()
{
    for( auto i:_observers)
    {
        i->update();
    }
}

void Secretary::Notify()
{
    for( auto i:_observers)
    {
        i->update();
    }
}

#include "observer.h"
#include "subject.h"

int main(int argc, char * argv[])
{
    Subject *st = new Secretary();
    Observer *a = new StockObserver("妈妈",st);
    Observer *b = new AnimationObserver("小东",st);
    st->Attach(a);
    st->Attach(b);
    st->Detch(b);
    st->Notify();

    return 0;
}

这个例子通过观察者员工们的状态,同时在构造观察者的时候可以设置观察者的状态,达到了观察者模式的效果。

最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/notifyStock_observer_pattern_14

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值