C++观察者模式

2024-06-23  本文已影响0人  风轻云淡宇
一、定义

观察者(Observer)模式 定义如下:
是一种对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

二、观察者模式组成:
三、 总结

1.观察者模式 主要解决了什么问题?
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

2.观察者模式 何时使用?
一个对象的状态发生改变,所有的依赖对象都将得到通知,进行广播通知。

3、观察者模式 的优缺点
【优点】

【缺点】

四、 代码示例:
#include <iostream>
#include <vector>
#include <algorithm>

// 抽象观察者角色
class Subject;

class Observer {
public:
    virtual ~Observer() {
        if (subject) {
            subject->detach(this);
        }
    }

    virtual void update() = 0;

protected:
    Observer(Subject* sub) : subject(sub) {
        subject->attach(this);
    }

    Subject* subject;
};

// 抽象目标角色
class Subject {
public:
    virtual ~Subject() {}

    void attach(Observer* observer) {
        observers.push_back(observer);
    }

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

    void notify() {
        for (Observer* observer : observers) {
            observer->update();
        }
    }

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

// 具体目标角色
class ConcreteSubject : public Subject {
public:
    void setState(int state) {
        this->state = state;
        notify();
    }

    int getState() const {
        return state;
    }

private:
    int state;
};

// 具体观察者角色
class ConcreteObserver : public Observer {
public:
    ConcreteObserver(ConcreteSubject* sub) : Observer(sub), subject(sub) {}

    void update() override {
        std::cout << "Observer: Subject's state is " << subject->getState() << std::endl;
    }

private:
    ConcreteSubject* subject;
};

int main() {
    ConcreteSubject subject;

    ConcreteObserver observer1(&subject);
    ConcreteObserver observer2(&subject);

    subject.setState(1);
    subject.setState(2);

    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读