设计模式-观察者模式

定义

观察者模式是一种软件设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象发生变化时,所有的观察者对象都会得到通知并且自动更新。

在观察者模式中,有三个核心角色:

  1. 主题(Subject):被观察的对象,通常会维护一个观察者列表,以便在状态发生变化时通知观察者。
  2. 观察者(Observer):观察主题对象的状态变化,当主题状态发生变化时,观察者将得到通知并执行相应的操作。
  3. 具体主题(ConcreteSubject):具体的主题实现类,负责维护一个观察者列表,并实现主题对象状态变化的通知逻辑。
  4. 具体观察者(ConcreteObserver):具体的观察者实现类,实现观察者接口,并定义观察者接收到通知后的具体操作。

实现举例

c++ 复制代码
#include <iostream>
#include <vector>
#include <string>

// 定义观察者接口
class Observer {
public:
    virtual void update(std::string message) = 0;
};

// 定义具体观察者实现类
class ConcreteObserver : public Observer {
public:
    void update(std::string message) override {
        std::cout << "ConcreteObserver received message: " << message << std::endl;
    }
};

// 定义主题接口
class Subject {
public:
    virtual void registerObserver(Observer* observer) = 0;
    virtual void removeObserver(Observer* observer) = 0;
    virtual void notifyObservers(std::string message) = 0;
};

// 定义具体主题实现类
class ConcreteSubject : public Subject {
public:
    std::vector<Observer*> observers;

    void registerObserver(Observer* observer) override {
        observers.push_back(observer);
    }

    void removeObserver(Observer* observer) override {
        for (auto it = observers.begin(); it != observers.end(); ++it) {
            if (*it == observer) {
                observers.erase(it);
                break;
            }
        }
    }

    void notifyObservers(std::string message) override {
        for (auto observer : observers) {
            observer->update(message);
        }
    }
};

int main() {
    ConcreteSubject subject;
    ConcreteObserver observer1, observer2, observer3;
    subject.registerObserver(&observer1);
    subject.registerObserver(&observer2);
    subject.registerObserver(&observer3);
    subject.notifyObservers("Hello World!"); // 发送通知,所有观察者都会收到消息并更新。
    subject.removeObserver(&observer2); // 移除一个观察者。
    subject.notifyObservers("Goodbye World!"); // 发送通知,剩余的观察者会收到消息并更新。
    return 0;
}

总结

观察者模式具有以下特性:

  1. 松耦合:观察者模式降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系,符合依赖倒置原则。也就是说,观察者和被观察者之间的依赖性相对较低,它们之间的交互是基于接口实现的,而不是基于具体的类。这样,被观察者和观察者之间可以更加灵活地组合和复用。
  2. 建立触发机制:观察者模式在目标(被观察者)和观察者之间建立了一套触发机制。当目标的状态发生变化时,会通知所有注册的观察者,观察者会根据通知更新自己的状态。
相关推荐
老码观察43 分钟前
设计模式实战解读(八):代理模式——控制访问的隐形中间层
设计模式·代理模式
我爱cope1 小时前
【Agent智能体12 | 反思设计模式-使用外部反馈】
人工智能·设计模式·语言模型·职场和发展
geovindu1 小时前
python: Bounded Parallelism Pattern
开发语言·python·设计模式·有界并行模式
我爱cope2 小时前
【Agent智能体11 | 反思设计模式-评估反射的影响的方法】
人工智能·设计模式·语言模型·职场和发展
nnsix2 小时前
设计模式 - 迭代器模式 笔记
笔记·设计模式·迭代器模式
IT策士3 小时前
第 23篇 k8s之Pod:多容器 Pod 与设计模式(Sidecar 等)
设计模式·容器·kubernetes
qq_2975746720 小时前
设计模式系列文章(基础篇第 11 篇):模板方法模式——定义算法骨架,实现代码复用与流程统一
算法·设计模式·模板方法模式
狂人开飞机1 天前
01. 工厂模式(Factory Pattern)
设计模式·c#
阿狸猿1 天前
论软件设计模式及其应用
设计模式
workflower1 天前
具身智能-三层结构
人工智能·设计模式·动态规划·软件工程·scrum