ڼС
梦回起点
做你害怕做的事,你会发现:不过如此
本站基于WordPress—主题by 设计窝
冀ICP备15003737号
梦回起点
Copyright © 2015-2024 All rights reserved.

观察者模式——大话设计模式读书笔记

观察者模式(Observer):观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

下面是观察者模式的UML图:

观察者模式

下面是C++实现的代码:

/*
* initm.com
* 作者:Stupid
* 时间:2017-10-27 23:12
* 描述: 代码使用QT5.9+MinGW53_32编译通过,代码为观察者模式的基本结构代码。
*/
#include <QCoreApplication>
#include <cstdlib>
#include <iostream>
#include <string>
#include <list>

class Observer
{
public:
    virtual void Update()=0;
};

class Subject
{
private:
    std::list<Observer*> observers;
public:
    void Attach(Observer* const& observer){
        observers.push_back(observer);
    }
    void Detach(Observer* const& observer){
        observers.remove(observer);
    }
    void Notify(){
        for(auto index: observers){
            index->Update();
        }
    }
};

class ConcreteSubject: public Subject
{
private:
    std::string subjectState;
public:
    std::string GetSubjectState(){
        return subjectState;
    }
    void SetSubjectState(const std::string& subjectState){
        this->subjectState = subjectState;
    }
};

class ConcreteObserver: public Observer
{
private:
    ConcreteSubject* subject;
    std::string name;
    std::string observerState;
public:
    ConcreteObserver(ConcreteSubject* subject, const std::string name):
        name(name){

        this->subject = subject;
    }
    void Update()override final{
        observerState = subject->GetSubjectState();
        std::cout << "观察者" << name << "的新状态:" << observerState << std::endl;
    }
    ConcreteSubject* GetSubject(){
        return subject;
    }
    void SetSubject(ConcreteSubject*& subject){
        this->subject = subject;
    }
};

int main(int argc, char *argv[])
{
    system("chcp 65001 > n");
    QCoreApplication a(argc, argv);
    ConcreteSubject* concreteSubject = new ConcreteSubject;
    concreteSubject->Attach(new ConcreteObserver(concreteSubject, std::string("X")));
    concreteSubject->Attach(new ConcreteObserver(concreteSubject, std::string("Y")));
    concreteSubject->Attach(new ConcreteObserver(concreteSubject, std::string("Z")));

    concreteSubject->SetSubjectState("维护");
    concreteSubject->Notify();
    return a.exec();
}

ConcreteObserver是具体被通知的类型,每次ConcreteSubject的状态发生变化,都会通知到每一个注册的ConcreteObserver

2017-10-27
                         
暂无评论

发表回复