当前位置: 首页 > article >正文

设计模式--观察者模式(Observer Pattern)

Observer模式

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。

观察者模式主要包含以下几个角色:

  1. Subject(主题):也被称为Observable,它是被观察的对象。当它的状态发生改变时,会通知所有的观察者。
  2. Observer(观察者):它是观察Subject的对象,当Subject的状态发生改变时,会收到通知。

观察者模式的主要优点是:

  • 支持简单的广播通信:Subject发生改变时,所有注册的Observer都会收到通知。
  • 低耦合:Subject和Observer可以独立修改,只要不改变他们之间的通信方式。

观察者模式适用于以下场景:

  • 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,你不希望这些对象是紧密耦合的。

以下是一个简单的C++实现的观察者模式(Observer Pattern)示例:

#include <iostream>
#include <list>

// 前向声明
class Observer;

// 主题
class Subject {
public:
    void attach(Observer* observer) {
        observers_.push_back(observer);
    }
    void detach(Observer* observer) {
        observers_.remove(observer);
    }
    void notify();

private:
    std::list<Observer*> observers_;
};

// 观察者
class Observer {
public:
    Observer(Subject* subject) : subject_(subject) {
        subject_->attach(this);
    }
    virtual void update() = 0;

protected:
    Subject* subject_;
};

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

// 具体观察者A
class ConcreteObserverA : public Observer {
public:
    ConcreteObserverA(Subject* subject) : Observer(subject) {}
    void update() override {
        std::cout << "Concrete Observer A is updated." << std::endl;
    }
};

// 具体观察者B
class ConcreteObserverB : public Observer {
public:
    ConcreteObserverB(Subject* subject) : Observer(subject) {}
    void update() override {
        std::cout << "Concrete Observer B is updated." << std::endl;
    }
};

int main() {
    Subject subject;

    ConcreteObserverA observerA(&subject);
    ConcreteObserverB observerB(&subject);

    subject.notify();

    return 0;
}

在这个例子中,Subject是主题,它维护了一个观察者列表。当主题的状态发生改变时,它会调用notify方法通知所有的观察者。
Observer是观察者,它定义了一个update接口。ConcreteObserverA和ConcreteObserverB是具体的观察者,它们实现了update接口。
通过这种方式,我们可以实现当主题的状态发生改变时,所有观察者都会得到通知并自动更新。


http://www.kler.cn/news/156020.html

相关文章:

  • 如何熟练使用vim工具?
  • spring boot的redis连接数过多导致redis服务器压力过大的一次问题排查
  • 数据挖掘之时间序列分析
  • 万界星空科技灯具行业MES介绍
  • 【java毕业设计源码】基于SSM框架的在线智能题库管理系统设计与实现
  • TensorRT安装及使用教程(ubuntu系统部署yolov7)
  • 解决浏览器缓存问题
  • 基于算能的国产AI边缘计算盒子8核心A53丨17.6Tops算力
  • 设置随机种子保证网络可复现性
  • 智能优化算法应用:基于黄金正弦算法无线传感器网络(WSN)覆盖优化 - 附代码
  • 有序表常见题型
  • 2023年GopherChina大会-核心PPT资料下载
  • Fiddler抓包工具之fiddler的常用快捷键
  • SpringAMQP入门案例——发送消息
  • Android CardView基础使用
  • 反序列化漏洞详解(三)
  • blender导出相机参数
  • ESP32使用mpu6050以及pid调参
  • Python - 字典3
  • 详解云WAF:免费GOODWAF归来
  • HarmonyOS—ArkTS中@Observed和@ObjectLink装饰器的嵌套类对象属性变化【鸿蒙专栏-11】
  • C语言实现Cohen_Sutherland算法
  • 构造函数的定义
  • Prometheus+Grafana搭建日志采集
  • Langchain-Chatchat的安装过程
  • C++基础 -35- string类
  • 操作系统·存储器管理
  • 亚信科技AntDB数据库完成中国信通院数据库迁移工具专项测试
  • unordered_map与unordered_set的实现(含迭代器)
  • go使用aes加密算法