设计学习笔记9:如何用C++实现观察者模式来管理对象间的通信?

观察者模式是一种行为设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。以下是使用C++实现观察者模式的步骤和示例代码:

观察者模式实现步骤:

  1. 定义观察者接口:创建一个观察者接口,声明一个更新方法,供被观察的对象在状态改变时调用。

  2. 实现具体观察者:为每个具体的观察者实现观察者接口,定义当接收到通知时的行为。

  3. 定义主题接口:创建一个主题接口,允许对象注册和注销观察者。

  4. 实现具体主题:为每个具体的主题实现主题接口,维护观察者列表,并提供方法来通知所有观察者。

  5. 注册和注销观察者:允许观察者注册到主题,并在不再需要接收通知时注销。

  6. 通知观察者:当主题的状态改变时,它应该通知所有注册的观察者。

示例代码:

#include <iostream>
#include <vector>
#include <list>

// 观察者接口
class Observer {
public:
    virtual void update() = 0;
    virtual ~Observer() {}
};

// 具体观察者
class ConcreteObserver : public Observer {
    std::string _name;
public:
    ConcreteObserver(const std::string& name) : _name(name) {}
    void update() override {
        std::cout << "Observer " << _name << " is notified." << std::endl;
    }
};

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

// 具体主题
class ConcreteSubject : public Subject {
    std::list<Observer*> _observers;
    std::string _state;

public:
    void setState(const std::string& state) {
        _state = state;
        notifyObservers();
    }

    std::string getState() const {
        return _state;
    }

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

    void removeObserver(Observer* observer) override {
        _observers.remove(observer);
    }

    void notifyObservers() override {
        for (Observer* observer : _observers) {
            observer->update();
        }
    }
};

int main() {
    ConcreteSubject subject;

    ConcreteObserver observer1("1");
    ConcreteObserver observer2("2");

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

    subject.setState("New State 1"); // 通知所有观察者状态改变

    subject.removeObserver(&observer1);

    subject.setState("New State 2"); // 只有observer2会被通知

    return 0;
}

在这个例子中,ConcreteSubject是主题,它维护了一个观察者列表,并且在状态改变时通知所有观察者。ConcreteObserver是观察者,实现了update方法来定义接收到通知时的行为。main函数展示了如何注册和注销观察者,以及如何触发通知。

观察者模式非常适合于实现分布式事件处理系统,如GUI界面更新、消息系统等场景。


分享一个有趣的 学习链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值