观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都能得到通知并自动更新。这个模式常用于事件驱动系统、GUI应用程序中,或者任何需要发布/订阅的场景。

以下是C++实现观察者模式的完整源代码:

项目实现思路

  1. 定义主题(Subject)

    • 主题是被观察的对象,它维护一个观察者的列表,当状态发生变化时,通知所有观察者。
  2. 定义观察者(Observer)

    • 观察者是关注主题状态变化的对象。当主题状态发生变化时,观察者会得到通知并更新自身状态。
  3. 抽象观察者(Observer)

    • 创建一个抽象的观察者类,定义一个更新接口,具体的观察者实现这个接口来响应主题状态的变化。
  4. 抽象主题(Subject)

    • 创建一个抽象的主题类,定义添加、删除观察者的接口,以及通知观察者的方法。
  5. 具体实现

    • 创建具体的主题类,继承自抽象主题类,实现状态变化时通知观察者。
    • 创建具体的观察者类,实现抽象观察者的接口。

C++ 完整源代码

#include <iostream>
#include <vector>
#include <algorithm>

// 抽象观察者类
class Observer {
public:
    virtual ~Observer() {}
    virtual void update(int state) = 0;  // 更新方法,观察者在主题状态变化时会被调用
};

// 抽象主题类
class Subject {
public:
    virtual ~Subject() {}
    virtual void attach(Observer* observer) = 0;  // 添加观察者
    virtual void detach(Observer* observer) = 0;  // 删除观察者
    virtual void notify() = 0;  // 通知所有观察者
};

// 具体观察者类
class ConcreteObserver : public Observer {
private:
    int observerState;  // 观察者的状态
    std::string name;    // 观察者的名称
public:
    ConcreteObserver(std::string observerName) : name(observerName), observerState(0) {}

    void update(int state) override {
        observerState = state;
        std::cout << "Observer " << name << " updated with state: " << observerState << std::endl;
    }
};

// 具体主题类
class ConcreteSubject : public Subject {
private:
    std::vector<Observer*> observers;  // 观察者列表
    int subjectState;  // 主题的状态
public:
    ConcreteSubject() : subjectState(0) {}

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

    // 删除观察者
    void detach(Observer* observer) override {
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    // 通知所有观察者
    void notify() override {
        for (Observer* observer : observers) {
            observer->update(subjectState);  // 通知每个观察者更新状态
        }
    }

    // 设置主题的状态,并通知所有观察者
    void setState(int state) {
        subjectState = state;
        std::cout << "Subject state updated to: " << subjectState << std::endl;
        notify();  // 通知观察者
    }

    int getState() const {
        return subjectState;
    }
};

// 测试观察者模式
int main() {
    // 创建主题对象
    ConcreteSubject subject;

    // 创建观察者对象
    ConcreteObserver observer1("Observer 1");
    ConcreteObserver observer2("Observer 2");
    ConcreteObserver observer3("Observer 3");

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

    // 改变主题的状态,所有观察者都会收到通知
    subject.setState(10);

    std::cout << "\nDetaching Observer 2...\n";
    subject.detach(&observer2);  // 从观察者列表中移除观察者2

    // 改变主题的状态,观察者2不会再收到通知
    subject.setState(20);

    return 0;
}

代码解释

  1. 抽象观察者类(Observer)

    • Observer类定义了update()方法,所有观察者类都需要实现这个方法,以便在主题状态变化时更新自身的状态。
  2. 抽象主题类(Subject)

    • Subject类提供了添加、删除观察者的接口,attach()用于注册观察者,detach()用于注销观察者,notify()用于通知所有观察者。
  3. 具体观察者类(ConcreteObserver)

    • ConcreteObserver继承自Observer,并实现了update()方法,用于更新观察者的状态。
  4. 具体主题类(ConcreteSubject)

    • ConcreteSubject继承自Subject,并实现了具体的观察者管理(如添加、删除)和状态更新功能。当主题的状态发生变化时,调用notify()方法通知所有观察者。
  5. 主函数(main)

    • 创建了一个ConcreteSubject对象(即主题),并创建了三个ConcreteObserver对象(即观察者)。注册观察者后,当主题的状态发生变化时,所有观察者都会收到通知并更新状态。

项目总结

观察者模式是一种常见的设计模式,用于处理一对多的关系。通过观察者模式,主题对象的状态发生变化时,所有的观察者都能够实时获得更新,从而避免了对象间的紧密耦合。本示例展示了C++如何实现该模式,包括了添加、删除观察者以及通知观察者的基本实现。

在实际应用中,观察者模式非常适用于事件驱动的系统、GUI编程和消息发布系统等场景。例如,Qt框架的信号与槽机制、Java的EventListener机制等,都是基于观察者模式的应用。

此实现比较基础,未来可以进行扩展,比如为观察者添加更多的状态、支持事件类型等功能,也可以考虑加入线程安全机制,以应对多线程环境中的并发访问问题。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐