设计模式-观察者模式
设计模式-观察者模式
- 前言
- 观察者模式
前言
由于作者做的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接口通知所有观察者信息。