C++实现设计模式之观察者模式

2023-07-19 23:52:00 浏览数 (3)

什么是观察者模式?

观察者模式是一种一对多的以来关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。它的主体是通知的发布者,发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知,将观察者和被观察的对象分离开。

废话不多说,上代码:

代码语言:c 复制
#include <iostream>  
#include <vector>  
  
using namespace std;  
  
// 观察者接口  
class Observer {  
public:  
    virtual void update() = 0;  
};  
  
// 主题接口  
class Subject {  
public:  
    virtual void attach(Observer* observer) = 0;  
    virtual void detach(Observer* observer) = 0;  
    virtual void notify() = 0;  
};  
  
// 具体主题实现  
class ConcreteSubject : public Subject {  
private:  
    vector<Observer*> observers;  
public:  
    void attach(Observer* observer) {  
        observers.push_back(observer);  
    }  
  
    void detach(Observer* observer) {  
        for (int i = 0; i < observers.size(); i  ) {  
            if (observers[i] == observer) {  
                observers.erase(observers.begin()   i);  
                break;  
            }  
        }  
    }  
  
    void notify() {  
        for (int i = 0; i < observers.size(); i  ) {  
            observers[i]->update();  
        }  
    }  
  
    void stateChanged() {  
        notify();  
    }  
};  
  
// 具体观察者实现  
class ConcreteObserver : public Observer {  
private:  
    Subject* subject;  
public:  
    ConcreteObserver(Subject* subject) {  
        this->subject = subject;  
        subject->attach(this);  
    }  
  
    ~ConcreteObserver() {  
        subject->detach(this);  
    }  
  
    void update() {  
        // 观察者收到通知后执行的操作  
        cout << "Subject changed!" << endl;  
    }  
};  
  
int main() {  
    ConcreteSubject subject;  
    ConcreteObserver observer1(&subject);  
    ConcreteObserver observer2(&subject);  
    ConcreteObserver observer3(&subject);  
  
    subject.stateChanged(); // 触发通知,观察者更新  
  
    return 0;  
}

在上面的代码中,​​Observer​​​是观察者接口,​​Subject​​​是主题接口。​​ConcreteSubject​​​是具体的主题实现,它维护一个观察者列表,并在状态改变时通知所有观察者。​​ConcreteObserver​​是具体的观察者实现,它在被通知时执行特定的操作。

在主函数中,我们创建了一个​​ConcreteSubject​​​实例,并将三个​​ConcreteObserver​​实例附加到该主题上。然后,当主题的状态改变时,所有附加的观察者都会收到通知并执行相应的操作。

0 人点赞