12、跟学23种设计模式(C++版):观察者模式

观察者模式(Observer Pattern)定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现分布式事件处理系统。

模式特点

1、 解耦:观察者模式将观察者与被观察者解耦,使得两者之间的依赖关系最小化;
2、 动态响应:当被观察对象的状态改变时,所有观察者对象都会被通知并更新;
3、 灵活性:可以在运行时动态地添加或移除观察者;
4、 扩展性:观察者模式支持广播通信,所有注册的观察者都会收到通知;

适用场景

1、 事件驱动系统:如GUI应用中的事件监听机制;
2、 订阅-发布系统:如新闻系统、消息队列等;
3、 模型-视图-控制器(MVC)架构:当模型数据改变时,视图应该自动更新;
4、 跨系统通知:如多个系统之间的数据同步;

C++案例

以下是一个简单的观察者模式的C++实现:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // 添加该头文件以使用 std::remove

// 观察者接口
class Observer {
public:
    virtual void update(const std::string &message) = 0;
    virtual ~Observer() = default;
};

// 具体观察者类
class ConcreteObserver : public Observer {
private:
    std::string name;
public:
    ConcreteObserver(const std::string &name) : name(name) {}
    void update(const std::string &message) override {
        std::cout << "Observer " << name << " received message: " << message << std::endl;
    }
};

// 主题类
class Subject {
private:
    std::vector<Observer*> observers;
public:
    void addObserver(Observer *observer) {
        observers.push_back(observer);
    }

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

    void notifyObservers(const std::string &message) {
        for (Observer *observer : observers) {
            observer->update(message);
        }
    }
};

// 主函数
int main() {
    Subject subject;
    ConcreteObserver observer1("A");
    ConcreteObserver observer2("B");

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

    subject.notifyObservers("Hello, Observers!");

    subject.removeObserver(&observer1);

    subject.notifyObservers("Observer A is removed.");

    return 0;
}

运行结果:

Observer A received message: Hello, Observers!Observer B received message: Hello, Observers!Observer*B*received*message:*Observer*A*is*removed.

案例说明:

  • Observer(观察者接口)

Observer 是一个纯虚类(接口),定义了一个 update 方法,所有具体的观察者类必须实现这个方法。当被观察的对象状态发生变化时,会调用这个方法通知观察者。

  • ConcreteObserver(具体观察者类)

ConcreteObserver 实现了 Observer 接口,并包含一个字符串成员变量 name 用于标识观察者。当主题对象通知观察者时,update 方法会输出收到的消息以及观察者的名称。

  • Subject(主题类)

Subject 类管理多个观察者对象。它提供 addObserver 方法来添加观察者,removeObserver 方法来移除观察者,notifyObservers 方法来通知所有观察者。当主题状态发生变化时,它会调用每个观察者的 update 方法来通知他们。

  • 主函数

在主函数中,创建了一个 Subject 对象和两个 ConcreteObserver 对象,并将观察者添加到主题中。通过调用 notifyObservers 方法,主题可以通知所有注册的观察者;当一个观察者被移除后,它将不再接收到通知。

*

总结

观察者模式提供了一种对象与对象之间的松耦合关系,使得一个对象状态改变时能够自动通知并更新相关依赖对象。这种模式的优点包括解耦、动态响应和扩展性,但在对象数量较多时可能会有性能问题。在实际开发中,观察者模式广泛应用于事件驱动系统、订阅-发布系统和MVC架构等场景中。

END

今天是日更的第23/100天

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: