首页 > 其他分享 >观察者设计模式

观察者设计模式

时间:2024-06-01 19:32:01浏览次数:20  
标签:Observer void 观察者 update observers state 设计模式

实现C++中的观察者设计模式通常包括以下几个关键组件:

 

1. **Subject(主题)**:这是被观察的对象,它维护一个观察者列表,并提供注册、注销观察者的方法以及通知所有观察者的方法。

 

2. **Observer(观察者)**:这是一个抽象接口或基类,定义了观察者需要实现的更新接口(如`update()`方法),以便在接收到主题的通知时进行相应的响应。

 

3. **ConcreteObserver(具体观察者)**:这些是实现了`Observer`接口的具体类,每个观察者有自己的更新逻辑,当接收到主题的通知时,会调用自己的`update()`方法来处理新的状态或数据。

 

以下是一个简单的C++实现示例:

 

```cpp

#include <iostream>

#include <vector>

#include <algorithm>

 

// 定义观察者接口(抽象基类)

class Observer {

public:

    virtual ~Observer() = default;

    // 更新方法,由具体观察者实现

    virtual void update(const int& new_state) = 0;

};

 

// 具体观察者类A

class ConcreteObserverA : public Observer {

public:

    void update(const int& new_state) override {

        std::cout << "Observer A received update: " << new_state << std::endl;

        // 在这里处理新状态,比如更新UI、触发计算等

    }

};

 

// 具体观察者类B

class ConcreteObserverB : public Observer {

public:

    void update(const int& new_state) override {

        std::cout << "Observer B received update: " << new_state << std::endl;

        // 在这里处理新状态,根据业务需求进行相应操作

    }

};

 

// 主题类,管理观察者并负责通知

class Subject {

private:

    std::vector<Observer*> observers_;

    int state_; // 假设主题有一个整型状态

 

public:

    void attach(Observer* observer) {

        observers_.push_back(observer);

    }

 

    void detach(Observer* observer) {

        observers_.erase(std::remove(observers_.begin(), observers_.end(), observer), observers_.end());

    }

 

    void setState(const int& new_state) {

        state_ = new_state;

        notifyObservers();

    }

 

private:

    void notifyObservers() {

        for (Observer* observer : observers_) {

            observer->update(state_);

        }

    }

};

 

int main() {

    Subject subject;

 

    ConcreteObserverA observerA;

    ConcreteObserverB observerB;

 

    subject.attach(&observerA);

    subject.attach(&observerB);

 

    subject.setState(10); // 设置新状态,观察者们会收到通知

 

    return 0;

}

```

 

在这个例子中:

 

- `Observer`接口定义了观察者必须实现的`update()`方法。

- `ConcreteObserverA`和`ConcreteObserverB`是具体的观察者类,它们实现了各自的`update()`方法来响应状态变化。

- `Subject`类维护了一个观察者列表,提供了`attach()`和`detach()`方法来添加和移除观察者,以及`setState()`方法来设置新的状态。当状态改变时,`notifyObservers()`会被调用,遍历观察者列表并调用每个观察者的`update()`方法。

 

这个简单示例展示了观察者模式的核心原理。实际应用中,可能还需要考虑线程安全、事件类型区分、弱引用避免循环引用等问题,具体实现会根据实际应用场景进行相应的扩展和优化。

 

标签:Observer,void,观察者,update,observers,state,设计模式
From: https://blog.csdn.net/weixin_43803780/article/details/138034987

相关文章

  • (JAVA)设计模式-适配器模式
    模式的定义和特点:适配器模式(Adapter)是一种将一个类的接口转换成客户希望的另外一个接口的设计模式,可以提高代码的复用性和灵活性。结构与实现:定义一个适配器类来实现业务接口,再继承现有组件库中已经存在的组件。示例:创建业务接口类:点击查看代码publicinte......
  • 设计模式定义
    一.设计模式的分类1.按照目的创建型:负责对象的创建结构型:处理类与对象间的组合行为型:类与对象交互中的职责分配2.按照范围类模式:处理类与子类的静态关系对象模式:处理对象间的动态关系 二.设计模式的定义创建型模式简单工厂模式提供一个工厂类,根据传入参数来决定......
  • [设计模式]行为型模式-观察者模式
    前言观察者模式(ObserverPattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。在观察者模式中,有两种主要的角色:观察者(Observer):观察者是一个接口或抽象类,它定义了一个更新的接口,使得被观察者在状态发生变......
  • JS设计模式学习【待吸收】
    版权:千锋HTML5大前端教研院,源自大前端私房菜JS设计模式一.设计模式介绍设计模式是我们在解决问题的时候针对特定问题给出的简洁而优化的处理方案在JS设计模式中,最核心的思想:封装变化。将变与不变分离,确保变化的部分灵活、不变的部分稳定。二.构造器模式类似......
  • c/c++设计模式--组合模式
      namespace_nmsp1{//文件相关类classFile{public://构造函数File(stringname):m_sname(name){}//显示文件名voidShowName(stringlvlstr)//lvlstr:为了显示层次关系的缩进字符串内容{......
  • 23种设计模式之装饰模式
    装饰模式1、定义装饰模式:动态的给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。2、装饰模式结构Component(抽象构建):它是具体构建和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法。ConcreteComponent(具体构建):定......
  • 设计模式:全网最全(23+10种)、最易懂(对比代码)、最简洁(三言两语)、最深度(带点评)的
    前言设计模式是软件开发中的重要工具,灵活掌握大量的设计模式,能够帮助我们编写更灵活、可维护和可扩展的代码。网上有许多关于设计模式的文章,往往把设计模式介绍得高深莫测,墨守成规。于是,不久前萌发了写一篇简单易懂的设计模式介绍的文章的想法。在开始之前,我想强调切勿滥......
  • 设计模式——单例模式
    一。引言当我们写一个体量比较大的代码使,如果这是堆积罗列,那么会发现有许多冗余的情况,并且还不利于团队共同协作,代码难以定位。于是为了解决这些问题,提高代码的可读性,减少耦合度,我们引入了设计模式。设计模式就像盖房子时的图纸,根据这些图纸的指导可以让我们把房子建的更漂......
  • 深入理解Java的设计模式
    设计模式(DesignPatterns)是软件开发中的宝贵经验总结,提供了解决常见设计问题的模板和最佳实践。在Java开发中,设计模式尤为重要,因为它们能够提高代码的可维护性、可扩展性和可重用性。本篇博客将详细介绍几种常见的设计模式,帮助读者掌握如何在Java开发中应用这些模式。什么是设......
  • C++设计模式的原则
    1、依赖倒置原则(DIP)·高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象稳定)。·抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)。2、开放封闭原则(OCP)·对扩展开放,对更改封闭。·类模块应该是可扩展的,但是不可修改。3、单一职责原......