吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1569|回复: 3
收起左侧

[讨论] 观察者模式

  [复制链接]
古月不傲 发表于 2020-11-16 11:51
[C++] 纯文本查看 复制代码
#include <iostream>
#include <list>

using namespace std;

namespace observer_pattern {
// 抽象一个信息更新类 也就是观察者
class abstract_info
{
public:
    virtual void update_info() = 0;
    ~abstract_info() {}
};

// 表格
class form : public abstract_info
{
public:
    virtual void update_info() override {
        printf("更新表格\n");
    }
};

// 柱状图
class histogram : public abstract_info
{
public:
    virtual void update_info() override {
        printf("更新柱状图\n");
    }
};

// 饼图
class sector_graph : public abstract_info
{
public:
    virtual void update_info() override {
        printf("更新饼图\n");
    }
};

// 抽象通知者
class abstract_notify
{
public:
    virtual void insert_item(abstract_info *info) = 0;
    virtual void remove_item(abstract_info *info, bool all = false) = 0;
    virtual void notify() = 0;
    virtual ~abstract_notify() {}
};

// 信息更新通知者
class info_update : public abstract_notify
{
public:
    virtual void insert_item(abstract_info *info) override {
        l.push_back(info);
    }
    virtual void remove_item(abstract_info *info, bool all = false) override {
        if (all) {
            l.clear();
        }         
        else {
            l.remove(info);
        }
    }
    virtual void notify() override {
        for (auto it = l.begin(); it != l.end(); it++) {
            (*it)->update_info();
        }
    }
private:
    list<abstract_info *> l;
}; 
} 

// 可以看出观察者模式 本质上只是通过一个中间类,提供一种容器存储要更新的对象 依次更新 实现解藕 利于管理
int main(void)
{
    using namespace observer_pattern;
    
    abstract_info *f = new form;
    abstract_info *h = new histogram;
    abstract_info *s = new sector_graph;

    abstract_notify *notify = new info_update;
    notify->insert_item(s);
    notify->insert_item(h);
    notify->insert_item(f);
    notify->notify();

    notify->remove_item(h);
    notify->notify();

    delete s;
    delete h;
    delete f;

    return 0;
}

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
qoovoop + 1 + 1 我很赞同!
461735945 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Gaho2002 发表于 2020-11-16 13:48
哇,这是森马语言啊
工夕布城 发表于 2020-11-16 14:59
a8416aa 发表于 2020-11-16 21:31
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 11:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表