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

C++观察者模式

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

C++观察者模式

现在假设一种情形:一个人(person)要去看公告(Note)的内容,需要Note去setNews(string);设置发布的内容,那么写下来就是一个Note类和person类,两个类根据需求写一些代码,写下来就是下面这样。。

#include 
#include 
#include 

using namespace std;
class Note {
public:
    void setNews(string a) {
        news = a;
        cout << a << endl;
    };
    string getNews(void) { return news; };

private:
    string news = "null";
};

class Person {
public:
    // void setNote(Note *note) { mNote = note; }
    Person(Note *nt) : mNote(nt) {}
    void printNews() { cout << getNews() << endl; }

private:
    Note *mNote;
    string getNews() { return mNote->getNews(); }

};
int main() {
    Note* noteA = new Note();
    noteA->setNews("国庆放7天");

    Person *personA = new Person(noteA);
    personA->printNews();
}

那么这是单独的一对一的情况,那么如果需要多对多呢?比如5个互相不认识的人,5个不同的公告版。硬写,就是先写5个person类,5个Note类,在互相组合。这样的代码和面向过程没有区别,难以维护,耦合度极高。不便于维护。自然可以想到把Note抽象出来,把Person抽象出来。让两个基类去耦合。

先把消息抽象出来成Msg类,用phone类去继承Msg  // 即模拟手机得到消息

class Msg {
public:
    void setNews(string a) {
        news = a;
        cout << a << endl;
    };
    string getNews(void) { return news; };

private:
    string news = "null";
};

class phone : public Msg {
public:
    void setNews(string a) { setNews(a); }
    void showNews() { cout << getNews() << endl; }
};

在把读消息的人抽象成reader类,用student去继承reader类。 // 模拟学生去看消息

class Reader {
public:
    Reader(Msg *nt) : mNote(nt) {}
    virtual void printNews() = 0;
    string getNews() { return mNote->getNews(); }

   private:
    Msg *mNote;
};

class student : public Reader {
public:
    student(string name, Msg *mg) : Reader(mg){
        mName = name;
    };
private:
    virtual void printNews() {
        cout << "我是" << mName << ": " ;
        cout << "读到了" << getNews() << endl;
    };

    string mName;
};

然后客户端调用: 手机上有消息“国庆放7天”, 小明读到了:“国庆放7天”。

int main() {
    Msg *msg = new phone("国庆放7天");
    Reader* mReader = new student("小明",msg);

    mReader->printNews();
}

以上就是所谓的观察者模式:就是抽象的Reader类去读取抽象的Msg类,这样。N个信息来源,比如手机,平板,电视。。。以及N个读信息的人,比如学生,医生,警察。都可以任意的组合,需要哪个人(比如student)和信息来源(比如iphone)就去初始化这两个类,并且通过统一的接口(Reader->printfNews())去模拟观察者读到消息。。

总之,观察者模式适用于N个对象和N个对象之间的交互。把需要耦合的部分放在了各自的基类里面。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/289634.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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