QtC++ 设计模式(三)——观察者模式

观察者模式

  • 序言
  • 环境
  • 理解
  • 源码

序言

还是参考的菜鸟教程,会C++的还是看C++的方式来得舒服。

环境

Qt5.12 C++

理解

使用符合UML规范的便于理解和回忆
QtC++ 设计模式(三)——观察者模式_第1张图片观察者保存观察对象的指针,便于随时获取观察对象的数据,同时存在update函数用于通知更改了数据。

被观察者用容器保存观察者的数据,在更新数据时遍历容器调用update函数通知了更新。
.

源码

observer.h

#ifndef OBSERVER_H
#define OBSERVER_H

#include 
#include 

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);

你可能感兴趣的:(#,C++设计模式,c++,qt,设计模式)