设计模式之观察者模式

观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,用于在对象之间维持一种一对多的依赖关系。当一个对象的状态发生变化时,它的所有依赖者(观察者)都会被自动通知和更新。

观察者模式涉及两个主要角色:

  1. 主题(Subject):也称为可观察对象(Observable),它是被观察的对象。主题维护了一个观察者列表,并提供了方法来添加、删除和通知观察者。
  2. 观察者(Observer):观察者是主题所依赖的对象。当主题的状态发生变化时,观察者会收到通知并执行相应的操作。

下面是一个简单的示例,演示了如何使用C++实现观察者模式

点击展开代码段

#include <iostream>
#include <vector>

// 前向声明
class Observer;

// 主题(可观察对象)
class Subject {
public:
    void attach(Observer* observer) {
        observers.push_back(observer);
    }

    void detach(Observer* observer) {
        // 从观察者列表中删除观察者
        auto it = std::find(observers.begin(), observers.end(), observer);
        if (it != observers.end()) {
            observers.erase(it);
        }
    }

    void notify() {
        // 通知所有观察者
        for (auto observer : observers) {
            observer->update();
        }
    }

private:
    std::vector<Observer*> observers;
};

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

// 具体观察者
class ConcreteObserver : public Observer {
public:
    ConcreteObserver(const std::string& name) : name(name) {}

    void update() override {
        std::cout << name << " received notification" << std::endl;
    }

private:
    std::string name;
};

int main() {
    // 创建主题和观察者
    Subject subject;
    ConcreteObserver observer1("Observer 1");
    ConcreteObserver observer2("Observer 2");

    // 添加观察者到主题
    subject.attach(&observer1);
    subject.attach(&observer2);

    // 主题状态发生变化,通知观察者
    subject.notify();

    // 删除观察者
    subject.detach(&observer2);

    // 再次通知观察者
    subject.notify();

    return 0;
}

在上面的示例中,主题类(Subject)维护了一个观察者列表,并提供了方法来添加(attach)、删除(detach)和通知(notify)观察者的功能。观察者类(Observer)是一个接口类,定义了观察者对象需要实现的方法。具体观察者类(ConcreteObserver)继承自观察者类,并实现了update()方法来定义观察者接收到通知后的行为。

在主函数中,我们创建了一个主题对象(Subject)和两个观察者对象(ConcreteObserver),然后将观察者对象添加到主题对象中。当主题对象的状态发生变化时,它会通知所有的观察者对象进行更新。我们还可以通过detach()方法将某个观察者对象从主题对象中删除,从而停止接收通知。

观察者模式的优点包括解耦、扩展性和灵活性。它允许主题和观察者之间松散耦合,使得它们可以独立地进行变化和扩展。此外,通过添加或删除观察者,我们可以动态地改变系统的行为。

需要注意的是,在实践中可能存在一些细微的差异,具体取决于特定的应用场景。例如,观察者模式还可以支持观察者接收主题的特定状态更新,以便只对感兴趣的状态进行相应的处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值