首页 > 编程语言 >C++设计模式:观察者模式

C++设计模式:观察者模式

时间:2023-06-05 19:56:24浏览次数:35  
标签:sub void ConcreteObserver 观察者 C++ 设计模式 string Subject

观察者模式又叫做发布-订阅模式;
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动的更新自己。

有两大类(主题和观察者)一共四个角色
从上面我们可以看到,这里面包含了:
(1) 抽象主题/抽象被观察者(Subject)角色:将所有观察者对象保存在一个集合中,可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象
(2) 具体主题/具体被观察者(ConcreteSubject)角色:该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知
(3) 抽象观察者(Observer)角色:它定义了一个更新接口,使得在得到主题/被观察者更新时通知自己
(4) 具体观察者(ConcreteObserver)角色:实现抽象观察者定义的更新接口,以便在得到主题/被观察者更新时通知自己更新自身状态

其UML类图如下:

observer.cpp:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <list>
using namespace std;

class Observer
{
    public:
        virtual void update(){}
        virtual string getName() {return "";}
};

class Subject
{
    public:
        void enroll(Observer *observer);
        void detach(Observer *observer);
        void notify();
        ~Subject();
    
    private:
        list<Observer*> observers;
};


class ConcreteSubject: public Subject 
{
    public:
        string getSubjectState();
        void setSubjectState(const string &str);
    
    private:
        string subjectState;
};

class ConcreteObserver:public Observer
{
    public:
        ConcreteObserver(ConcreteSubject *subject, string name);
        void update();
        string getName();
    
    private:
        string name;
        string observerState;
        ConcreteSubject *subject;
};

void Subject::enroll(Observer *observer)
{
    observers.push_back(observer);
}

void Subject::detach(Observer *observer)
{
    observers.remove(observer);
}

void Subject::notify()
{
    list<Observer*>::iterator it = observers.begin();
    while(it != observers.end())
    {
        (*it)->update();
        it++;
    }
}

Subject::~Subject()
{
    printf("开始析构了\n");
    list<Observer*>::iterator it = observers.begin();
    while(it != observers.end())
    {
        printf("开始删除: ");
        cout<<(*it)->getName()<<endl;
        delete *it;
        it++;
    }
    observers.clear();
}

string ConcreteSubject::getSubjectState()
{
    return subjectState;
}

void ConcreteSubject::setSubjectState(const string &str)
{
    subjectState = str;
}

ConcreteObserver::ConcreteObserver(ConcreteSubject *subject, string name)
{
    this->subject = subject;
    this->name = name;
}

void ConcreteObserver::update()
{
    observerState = subject->getSubjectState();
    cout<<"发布者更新东西了!!!订阅者: "<<name<<" 状态: "<<observerState<<endl; 
}

string ConcreteObserver::getName()
{
    return name;
}

int main()
{
    ConcreteSubject *sub = new ConcreteSubject;
    sub->enroll(new ConcreteObserver(sub, "第一个粉丝"));
    sub->enroll(new ConcreteObserver(sub, "第二个粉丝"));
    sub->enroll(new ConcreteObserver(sub, "第三个粉丝"));

    sub->setSubjectState("刘亦菲");
    sub->notify();
    printf("<<------------------------------------->>\n");
    sub->enroll(new ConcreteObserver(sub, "王二麻子"));
    sub->setSubjectState("刘诗诗");
    sub->notify();

    cout<<endl;
    delete sub;
    return 0;
}

 

标签:sub,void,ConcreteObserver,观察者,C++,设计模式,string,Subject
From: https://www.cnblogs.com/lyfily-p-7439305/p/17458790.html

相关文章

  • 初遇C++(一)
    认识C++C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(objectorientedprogramming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,本贾......
  • c++ condition_variable wait unique_lock,cv.notifyall()
    #include<atomic>#include<chrono>#include<cmath>#include<condition_variable>#include<cstddef>#include<forward_list>#include<fstream>#include<functional>#include<future>#include<iom......
  • C++11中的std::function
    看看这段代码先来看看下面这两行代码:std::function<void(EventKeyboard::KeyCode,Event*)>onKeyPressed;std::function<void(EventKeyboard::KeyCode,Event*)>onKeyReleased;这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊。std::function这是什么东西?如果你对上......
  • C、C++、Java等控制汽车- 汽车引擎控制系统
    汽车代码的实现 - 汽车引擎控制系统汽车引擎控制系统是汽车代码中最重要的一部分之一。控制系统的目的是确保引擎在各种负载下运行顺畅,并最大程度地减少排放。控制系统的主要组成部分是ECU(电子控制单元),它是一种具有微处理器的电子设备,可接收传感器信号并控制汽车的各种功能,从燃......
  • 汽车代码的实现 - 用python、c++写的自动驾驶系统
    汽车代码的实现-自动驾驶系统自动驾驶系统是近年来发展迅速的汽车代码领域之一。这个系统旨在使用传感器和计算机,自动化控制车辆行驶,消除驾驶员的错误和危险。实现自动驾驶系统需要使用一些重要的编程语言和技术,如Python、Matlab、深度学习和机器视觉算法。此外,还需要使用各种......
  • C++设计模式:单例模式
    什么是单例模式?单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性。单例模式分类有哪些?单例模式可以分为懒汉式和饿汉式,两者之间的区别在于创建实例的时间不同:懒汉式:指系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。(这种方式要考......
  • C++ 子类调用父类的方法,静态方法的调用
    #include<iostream>classA{public:A();~A();virtualvoidsay(){std::cout<<"HellothisisclassA!\n";}staticvoidtest(){std::cout<<"HellothisisclassAtestfunction..!\n";}private:};......
  • c++ 与c#之间的字符串传递
    1.方法中不要直接返回字符串,防止内存崩溃。c++写法:voidnecall(char*str1,char*outdata){strcpy(outdata,str1);}outdata为导出数c#写法:[DllImport("testdemo")]privatestaticexternvoidnecall(stringa,StringBuilderb);StringBuilderb=new......
  • C#设计模式19——装饰器模式的写法
    装饰器模式(DecoratorPattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,而不需要修改这个对象的代码。What(什么)装饰器模式是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,而不需要修改这个对象的代码。在装饰器模式中,你可以定义一个装......
  • 利用PImpl在C++14中优雅调用C++17方法
    诉求你的工程由C++14写成,某天你看中了一个功能强大的三方库,一切都好除了该库仅支持C++17编译,对于比较复杂的三方库使用C++14进行重构工作量太大,有没有优雅的办法?实现历史总是惊人的相似,为了解决这一问题前人发明了PImpl编程方法用于隐藏class的实现细节,头文件中仅声明抽象class......