用C++11打造智能观察者模式:详解实现步骤完整示例代码

开发 后端
观察者模式是一种行为设计模式,其中一个对象(主题)维护其依赖对象(观察者)的列表,当主题的状态发生变化时,它通知所有观察者。

观察者模式是一种行为设计模式,其中一个对象(主题)维护其依赖对象(观察者)的列表,当主题的状态发生变化时,它通知所有观察者。以下是一个使用C++11实现观察者模式的简单例子:

  • 定义观察者接口(Observer): 创建一个观察者接口,该接口包含观察者需要实现的更新方法。这个接口可以包含其他方法,但更新方法是必须的。
  • 创建具体观察者类: 实现观察者接口的具体类。每个具体观察者类都应该实现更新方法,该方法定义了在主题状态变化时观察者应该执行的操作。
  • 定义主题接口(Subject): 创建一个主题接口,该接口包含了添加、移除和通知观察者的方法。这里可以选择在主题接口中定义更新状态的方法,也可以在具体主题类中定义。
  • 创建具体主题类: 实现主题接口的具体类。该类应该维护一个观察者列表,并在状态变化时通知所有观察者。
  • 实现客户端代码: 在客户端代码中创建具体的主题和观察者对象,将观察者添加到主题中。客户端还负责触发主题状态的变化,从而通知观察者。

下面是对上述步骤的更详细的讲解:

步骤 1:定义观察者接口

// Observer.h
#pragma once

class Observer {
public:
    virtual void update(int data) = 0;
};

步骤 2:创建具体观察者类

// ConcreteObserverA.h
#pragma once
#include <iostream>
#include "Observer.h"

class ConcreteObserverA : public Observer {
public:
    void update(int data) override {
        std::cout << "Observer A 收到更新,数据为: " << data << std::endl;
    }
};
// ConcreteObserverB.h
#pragma once
#include <iostream>
#include "Observer.h"

class ConcreteObserverB : public Observer {
public:
    void update(int data) override {
        std::cout << "Observer B 收到更新,数据为: " << data << std::endl;
    }
};

步骤 3:定义主题接口

// Subject.h
#pragma once
#include "Observer.h"

class Subject {
public:
    virtual void addObserver(Observer* observer) = 0;
    virtual void removeObserver(Observer* observer) = 0;
    virtual void notifyObservers(int data) = 0;
};

步骤 4:创建具体主题类

// ConcreteSubject.h
#pragma once
#include <vector>
#include "Subject.h"

class ConcreteSubject : public Subject {
private:
    std::vector<Observer*> observers;
    int data;

public:
    void addObserver(Observer* observer) override {
        observers.push_back(observer);
    }

    void removeObserver(Observer* observer) override {
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    void notifyObservers(int data) override {
        for (Observer* observer : observers) {
            observer->update(data);
        }
    }

    void setData(int newData) {
        data = newData;
        notifyObservers(data);
    }

    int getData() const {
        return data;
    }
};

步骤 5:实现客户端代码

// main.cpp
#include "ConcreteObserverA.h"
#include "ConcreteObserverB.h"
#include "ConcreteSubject.h"

int main() {
    ConcreteSubject subject;
    ConcreteObserverA observerA;
    ConcreteObserverB observerB;

    subject.addObserver(&observerA);
    subject.addObserver(&observerB);

    subject.setData(123);

    subject.removeObserver(&observerA);

    subject.setData(456);

    return 0;
}

在这个例子中,我们创建了抽象观察者类 Observer,具体观察者类 ConcreteObserverA  ConcreteObserverB。然后,我们定义了抽象主题类 Subject 和具体主题类 ConcreteSubject。最后,在客户端代码中,我们创建了具体的主题和观察者对象,将观察者添加到主题中,并演示了状态变化时如何通知观察者,以及如何移除观察者。

责任编辑:姜华 来源: 今日头条
相关推荐

2020-10-26 08:45:39

观察者模式

2013-11-26 17:09:57

Android设计模式

2021-07-08 11:28:43

观察者模式设计

2024-06-04 13:11:52

Python行为设计模式开发

2021-09-06 10:04:47

观察者模式应用

2021-09-29 19:45:24

观察者模式Observable

2022-01-29 22:12:35

前端模式观察者

2011-04-29 09:22:22

2021-03-29 07:14:28

Spring观察者模式

2012-08-27 10:52:20

.NET架构观察者模式

2024-02-18 12:36:09

2015-11-25 11:10:45

Javascript设计观察

2022-07-13 08:36:57

MQ架构设计模式

2009-03-30 09:39:04

观察者思想换位设计模式

2021-01-25 05:38:04

设计原理VueSubject

2021-06-03 12:26:28

观察者模式面试阿里P6

2021-03-30 15:30:44

鸿蒙HarmonyOS应用开发

2022-05-09 10:50:13

观察者模式设计模式

2011-11-21 14:21:56

HTML 5

2012-05-21 09:31:56

HTML5
点赞
收藏

51CTO技术栈公众号