观察者模式 Jun 25, 2024 观察者模式 包含抽象观察者类和具体观察者类,包含update函数 包含抽象主题类和具体主题类,包含observer_list和notify函数,其中notify函数搜索observer_list并调用各个observer的update函数 { public: virtual ~Observer() = default; virtual void Update(int hour) = 0; }; class StudentObserver :public Observer { public: StudentObserver() = default; StudentObserver(const std::string& name) :m_Name(name) {} virtual void Update(int hour) override { std::cout << m_Name << " " << hour << std::endl; } private: std::string m_Name; }; class Subject { public: virtual ~Subject() = default; virtual void Attach(std::shared_ptr<Observer> observer) = 0; virtual void Detach(std::shared_ptr<Observer> observer) = 0; virtual void Notify() = 0; }; class ClockSubject :public Subject { public: virtual void Attach(std::shared_ptr<Observer> observer) override { if (std::find(observer_list.begin(), observer_list.end(), observer) == observer_list.end()) { observer_list.emplace_back(observer); } } virtual void Detach(std::shared_ptr<Observer> observer) override { observer_list.remove(observer); } virtual void Notify() override { hour++; for (auto elem : observer_list) { elem->Update(hour); } } private: int hour = 0; std::list<std::shared_ptr<Observer>> observer_list; }; int main() { std::unique_ptr<Subject> clock = std::make_unique<ClockSubject>(); std::shared_ptr<Observer> Alice = std::make_shared<StudentObserver>("Alice"); std::shared_ptr<Observer> Bob = std::make_shared<StudentObserver>("Bob"); clock->Attach(Alice); clock->Attach(Bob); clock->Notify(); clock->Notify(); clock->Notify(); return 0; }