【设计模式】观察者模式 - 实践

概念

行为模式


类图

Observer


代码

#include <iostream>
  #include <unordered_map>
    using namespace std;
    class EventListener
    {
    public:
    virtual void Update(const string& filename) = 0;
    };
    class LoggingListener
    : public EventListener {
    public:
    LoggingListener(const string& filename, const string& message) {
    log = filename;
    msg = message;
    }
    void Update(const string& filename) override {
    cout <<
    "Logging: " << log <<
    ", Content:" << msg << endl;
    log = filename;
    }
    private:
    string log;
    string msg;
    };
    class EmailAlertsListener
    : public EventListener {
    public:
    EmailAlertsListener(const string& email, const string& message) {
    eml = email;
    msg = message;
    }
    void Update(const string& filename) override {
    cout <<
    "EmailAlert: " << eml <<
    ", Content:" << msg << endl;
    eml = filename;
    }
    private:
    string eml;
    string msg;
    };
    class EventManger
    {
    public:
    void Subscribe(const string& eventType, EventListener* listener) {
    listeners[eventType] = listener;
    }
    void Unsubscribe(const string& eventType, EventListener* listener) {
    listeners.erase(eventType);
    }
    void Notify(const string& eventType, const string& data) {
    for (const auto& listener : listeners) {
    listener.second->
    Update(data);
    }
    }
    private:
    unordered_map<string, EventListener*> listeners;
      };
      class Editor
      {
      public:
      Editor() {
      events = new EventManger();
      }
      void OpenFile(const string& path) {
      file = path;
      events->
      Notify("open", file);
      }
      void SaveFile() {
      events->
      Notify("save", file);
      }
      EventManger* events;
      private:
      string file;
      };
      int main(int argc, char *argv[]) {
      auto editor = new Editor();
      auto logger = new LoggingListener("/path/to/log.txt", "有人打开了文件");
      editor->events->
      Subscribe("open", logger);
      // auto emailAlerts = new EmailAlertsListener("admin@example.com", "有人更改了文件");
      // editor->events->Subscribe("save", emailAlerts);
      editor->
      OpenFile("JayChou.album");
      editor->
      SaveFile();
      // delete emailAlerts;
      delete logger;
      delete editor;
      return 0;
      }
posted on 2025-10-09 16:57  ljbguanli  阅读(3)  评论(0)    收藏  举报