8、C++设计模式及实际应用-观察者模式

行为型模式

观察者模式: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新,消息队列、事件分发等等都使用了这种设计模式。

本节我们以一个新闻发布和订阅系统的例子来讲述观察者模式

下面代码是抽象类的定义

class Observer {
public:
  Observer(string& name) {
    this->name_ = name;
  }

  string& getName() {
    return name_;
  }

  virtual void dispatch(const std::string& subject, const std::string& content) = 0;

protected:
  string name_;
};

class Subject {
public:
  // 订阅
  void subscribe(Observer* observer) {
    observers[observer->getName()] = observer;
  }

  // 取消订阅
  void unsubscribe(Observer* observer) {
    auto it = observers.find(observer->getName());
    if (it != observers.end()) {
      observers.erase(it);
    }
  }

  virtual void notify(const std::string&& news) = 0;

protected:
  map<string, Observer*> observers;
};

下面是实体类的定义

// 体育新闻
class SportsNews : public Subject {
public:
  void notify(const std::string&& news) {
    for (auto it : observers) {
      it.second->dispatch("sports", news);
    }
  }
};

// 军事新闻
class MilitaryNews : public Subject {
public:
  void notify(const std::string&& news) {
    for (auto it : observers) {
      it.second->dispatch("military", news);
    }
  }
};

// 读者1
class Reader1 : public Observer {
public:
  Reader1(string&& name) : Observer(name) {}

  void dispatch(const std::string& subject, const std::string& content) {
    cout << name_ << " recv " << subject << ": " << content << endl;
  }
};

// 读者2
class Reader2 : public Observer {
public:
  Reader2(string&& name) : Observer(name) {}

  void dispatch(const std::string& subject, const std::string& content) {
    cout << name_ << " recv " << subject << ": " << content << endl;
  }
};

使用示例

int main() {
  SportsNews sportsNews;
  MilitaryNews militaryNews;

  Reader1 reader1("reader1");
  Reader1 reader2("reader2");

  // 读者1和读者2都订阅了体育新闻
  sportsNews.subscribe(&reader1);
  sportsNews.subscribe(&reader2);

  // 读者1订阅了军事新闻 
  militaryNews.subscribe(&reader1);

  // 新闻发布
  sportsNews.notify("7月体育新闻要点");
  militaryNews.notify("7月军事新闻要点");

  return 0;
}

运行结果

reader1 recv sports: 7月体育新闻要点
reader2 recv sports: 7月体育新闻要点
reader1 recv military: 7月军事新闻要点

下面是具体的UML类图
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值