设计模式-观察者模式

在C++中,观察者模式(Observer Pattern)是一种行为设计模式,用于定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都将得到通知并自动更新。以下是一个简单的C++观察者模式的示例:

示例一:

cpp 复制代码
#include <iostream>
#include <vector>

// 前向声明
class Observer;

// 主题类
class Subject {
public:
    void attach(Observer* observer) {
        observers.push_back(observer);
    }

    void notify() {
        for (Observer* observer : observers) {
            observer->update();
        }
    }

private:
    std::vector<Observer*> observers;
};

// 观察者类
class Observer {
public:
    virtual void update() = 0;
};

// 具体观察者类
class ConcreteObserver : public Observer {
public:
    ConcreteObserver(const std::string& name) : name(name) {}

    void update() override {
        std::cout << name << " has been notified." << std::endl;
    }

private:
    std::string name;
};

int main() {
    Subject subject;
    ConcreteObserver observer1("Observer 1");
    ConcreteObserver observer2("Observer 2");

    subject.attach(&observer1);
    subject.attach(&observer2);

    // 主题状态发生变化,通知观察者
    subject.notify();

    return 0;
}

在这个示例中,Subject(主题)维护了一个Observer(观察者)的列表,可以动态添加和删除观察者。当Subject的状态发生变化时,调用notify方法通知所有观察者更新。Observer定义了一个纯虚函数update,具体的观察者类ConcreteObserver实现了update方法,在update方法中定义了具体的更新逻辑。

这个示例展示了一个简单的观察者模式实现,你可以根据实际需求扩展和修改代码来满足具体的场景。观察者模式在C++中常用于实现异步消息通知、事件处理等场景。

示例二:

cpp 复制代码
#include <iostream>
#include <vector>

// 抽象观察者类
class Observer {
public:
    virtual void update() = 0;
};

// 具体观察者类
class ConcreteObserver : public Observer {
public:
    void update() override {
        std::cout << "ConcreteObserver updated!" << std::endl;
    }
};

// 主题类
class Subject {
private:
    std::vector<Observer*> observers;  // 存储观察者对象的向量

public:
    // 添加观察者
    void attach(Observer* observer) {
        observers.push_back(observer);
    }

    // 移除观察者
    void detach(Observer* observer) {
        auto it = std::find(observers.begin(), observers.end(), observer);
        if (it!= observers.end()) {
            observers.erase(it);
        }
    }

    // 通知所有观察者
    void notifyObservers() {
        for (Observer* observer : observers) {
            observer->update();
        }
    }
};

int main() {
    // 创建主题对象
    Subject subject;

    // 创建具体观察者对象
    ConcreteObserver observer1;
    ConcreteObserver observer2;

    // 注册观察者
    subject.attach(&observer1);
    subject.attach(&observer2);

    // 模拟主题状态改变
    subject.notifyObservers();

    // 移除观察者
    subject.detach(&observer1);

    // 再次模拟主题状态改变
    subject.notifyObservers();

    return 0;
}

在上述示例中,我们定义了一个抽象的Observer类,以及一个具体的ConcreteObserver类来实现具体的更新逻辑。Subject类作为主题,维护了一个观察者列表,并提供了添加、移除和通知观察者的方法。

main函数中,我们创建了主题对象和两个具体的观察者对象,并将它们注册到主题上。然后,通过模拟主题状态的改变,触发通知观察者的操作,使得观察者能够得到更新。

这只是一个简单的观察者模式实现示例,实际应用中可能需要根据具体需求进行更复杂的设计和实现。例如,可能需要支持动态添加和移除观察者、处理观察者的优先级等。根据实际情况,可以对这个示例进行扩展和改进

相关推荐
workflower2 天前
具身智能研究对象:物理交互中的智能行为
设计模式·动态规划·软件工程·软件构建·scrum
折哥的程序人生 · 物流技术专研2 天前
Java 23 种设计模式:从踩坑到精通 | 抽象工厂 —— 支付/收款如何成套创建?跨平台 UI 如何一键换肤?
java·开发语言·后端·设计模式
老码观察2 天前
设计模式实战解读(八):代理模式——控制访问的隐形中间层
设计模式·代理模式
我爱cope2 天前
【Agent智能体12 | 反思设计模式-使用外部反馈】
人工智能·设计模式·语言模型·职场和发展
geovindu2 天前
python: Bounded Parallelism Pattern
开发语言·python·设计模式·有界并行模式
我爱cope2 天前
【Agent智能体11 | 反思设计模式-评估反射的影响的方法】
人工智能·设计模式·语言模型·职场和发展
nnsix2 天前
设计模式 - 迭代器模式 笔记
笔记·设计模式·迭代器模式
geovindu2 天前
go: Bounded Parallelism Pattern
开发语言·后端·设计模式·golang·有界并行模式
IT策士2 天前
第 23篇 k8s之Pod:多容器 Pod 与设计模式(Sidecar 等)
设计模式·容器·kubernetes
qq_297574673 天前
设计模式系列文章(基础篇第 11 篇):模板方法模式——定义算法骨架,实现代码复用与流程统一
算法·设计模式·模板方法模式