我们将创建一个简单的场景,其中包含一个被观察的对象(Subject
)和多个观察者(Observer
)。被观察的对象在其状态改变时通知所有观察者。
以下是实现的步骤和代码:
-
定义观察者接口(Observer):这个接口包含一个用于接收更新的方法,所有具体的观察者类都需要实现这个接口。
-
定义被观察对象类(Subject):这个类维护一系列的观察者,并提供添加和移除观察者的方法。当状态改变时,
Subject
会通知所有观察者。 -
创建具体的观察者类:这些类实现了
Observer
接口,并在接收到更新通知时执行具体的行动。 -
演示:创建
Subject
对象和多个观察者对象,然后改变Subject
的状态来观察结果。
#include <iostream>
#include <list>
// 观察者接口
class Observer {
public:
virtual ~Observer() {}
virtual void update() = 0;
};
// 被观察的对象
class Subject {
std::list<Observer*> observers;
public:
void attach(Observer* observer) {
observers.push_back(observer);
}
void detach(Observer* observer) {
observers.remove(observer);
}
void notify() {
for (Observer* observer : observers) {
observer->update();
}
}
// 这里可以添加用于改变状态的方法,进而触发notify
void changeState() {
// 改变状态的代码
notify(); // 状态改变后通知所有观察者
}
};
// 具体的观察者
class ConcreteObserver : public Observer {
std::string name;
public:
ConcreteObserver(const std::string& name) : name(name) {}
void update() override {
std::cout << "观察者 " << name << " 收到通知" << std::endl;
}
};
// 主函数,演示观察者模式
int main() {
Subject subject;
ConcreteObserver observer1("观察者1");
ConcreteObserver observer2("观察者2");
subject.attach(&observer1);
subject.attach(&observer2);
subject.changeState(); // 改变状态并通知观察者
return 0;
}
这个代码展示了一个简单的观察者模式实现。当Subject
的changeState
方法被调用时,所有注册的观察者都会收到通知。您可以根据具体的需要修改Subject
类和ConcreteObserver
类来适应不同的场景。
https://chat.openai.com/share/5dbdfa47-63b0-41b2-a222-aba4cf590a26