概念
实现:
1.定义一个观察者抽象类,抽象类中有一个update接口,负责修改对象的变化
2.然后需要被通知的类 需要继承该类
// 观察者接口
class Observer {
public:
virtual void update(const std::string& message) = 0;
};
// 具体观察者
class ConcreteObserver : public Observer {
public:
ConcreteObserver(const std::string& name) : name(name) {}
void update(const std::string& message) override {
std::cout << name << "收到通知: " << message << std::endl;
}
private:
std::string name;
};
2. 定义被主题类,主题类发生变化时会通知 观察者对象
// 主题(被观察者)接口
class Subject {
public:
virtual void attach(Observer* observer) = 0;
virtual void detach(Observer* observer) = 0;
virtual void notify(const std::string& message) = 0;
};
// 具体主题
class ConcreteSubject : public Subject {
public:
void attach(Observer* observer) override {
observers.push_back(observer);
}
void detach(Observer* observer) override {
// 从观察者列表中移除观察者
for (auto it = observers.begin(); it != observers.end(); ++it) {
if (*it == observer) {
observers.erase(it);
break;
}
}
}
void notify(const std::string& message) override {
// 通知所有观察者
for (Observer* observer : observers) {
observer->update(message);
}
}
private:
std::vector<Observer*> observers;
};
实例:
int main() {
ConcreteSubject subject;
ConcreteObserver observer1("观察者1");
ConcreteObserver observer2("观察者2");
subject.attach(&observer1);
subject.attach(&observer2);
subject.notify("Hello, 观察者们!");
}