栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【设计模式】观察者模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【设计模式】观察者模式

概念

行为模式


类图


代码
#include 
#include 

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 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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1003622.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号