前言
由于作者做的C++开发比较多所以本文实例都以C++语言方式给出。
观察者模式
// 观察者接口
class Observer {
public:
virtual ~Observer() = default;
virtual void update(const std::string& message) = 0;
};
// 主题接口
class Subject {
public:
virtual ~Subject() = default;
virtual void attach(Observer* observer) = 0;
virtual void detach(Observer* observer) = 0;
virtual void notify(const std::string& message) = 0;
};
// 具体主题实现
class ConcreteSubject : public Subject {
private:
std::vector<Observer*> observers_;
public:
void attach(Observer* observer) override {
observers_.push_back(observer);
}
void detach(Observer* observer) override {
observers_.erase(std::remove(observers_.begin(), observers_.end(), observer), observers_.end());
}
void notify(const std::string& message) override {
for (Observer* observer : observers_) {
observer->update(message);
}
}
};
// 具体观察者实现
class ConcreteObserver : public Observer {
private:
std::string name_;
public:
explicit ConcreteObserver(const std::string& name) : name_(name) {}
void update(const std::string& message) override {
std::cout << name_ << " received message: " << message << std::endl;
}
};
观察者模式的核心概念:Subject维护观察者列表,当状态变化时通知所有观察者。代码包含主题接口、具体主题、观察者接口和具体观察者实现。
主题提供一些状态或者功能信息回调给观察者,可以有多个观察者观察同一个主题。上面例子中通过attach接口向主题注册观察者指针,通过detach接口取消注册观察者指针,主题通过notify接口通知所有观察者信息。