C++观察者模式

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


#include <stdlib.h>
#include <iostream>
#include <string>

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个对象之间的交互。把需要耦合的部分放在了各自的基类里面。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值