设计模式-观察者(发布订阅)模式

简介: 设计模式-观察者(发布订阅)模式
/*
行为型模式:主要关注的是对象之间的通信
观察者-监听者模式(发布-订阅模式):主要关注的是对象的一对多的关系,
也就是多个对象都依赖一个对象,当该对象的状态发生改变时,其他对象都能接收到相应的通知。
一组数据(对象)-》曲线图/柱状图/圆饼图
当数据对象改变时,对象1、对象2、对象3应该及时的收到相应的通知
Subject(主题)主题有更改,应该及时通知相应的观察者,去处理相应的事件
*/
#include <unordered_map>
#include <list>
//观察者抽象类
class Observer 
{
public:
  //处理消息的接口
  virtual void handle(int msgid) = 0;
};
//第一个观察者实例
class Observer1 : public Observer
{
public:
  void handle(int msgid)
  {
    switch (msgid)
    {
    case 1:
      cout << "Observer1 recv 1 msg!" << endl;
      break;
    case 2:
      cout << "Observer1 recv 2 msg!" << endl;
      break;
    default:
      cout << "Observer1 recv unknow msg!" << endl;
      break;
    }
  }
};
//第二个观察者实例
class Observer2 : public Observer
{
public:
  void handle(int msgid)
  {
    switch (msgid)
    {
    case 2:
      cout << "Observer2 recv 2 msg!" << endl;
      break;
    default:
      cout << "Observer2 recv unknow msg!" << endl;
      break;
    }
  }
};
//第三个观察者实例
class Observer3 : public Observer
{
public:
  void handle(int msgid)
  {
    switch (msgid)
    {
    case 1:
      cout << "Observer3 recv 1 msg!" << endl;
      break;
    case 3:
      cout << "Observer3 recv 3 msg!" << endl;
      break;
    default:
      cout << "Observer3 recv unknow msg!" << endl;
      break;
    }
  }
};
//主题类
class Subject
{
public:
  //给主题增加观察者对象
  void addObserver(Observer* obser, int msgid)
  {
    _subMap[msgid].push_back(obser);
    /*auto it = _subMap.find(msgid);
    if (it != _subMap.end())
    {
      it->second.push_back(obser);
    }
    else {
      list<Observer*> lis;
      lis.push_back(obser);
      _subMap.insert({msgid, lis});
    }*/
  }
  //主题检测发生改变,通知相应的观察者对象处理事件
  void dispatch(int msgid)
  {
    auto it = _subMap.find(msgid);
    if (it != _subMap.end())
    {
      for (Observer *pObser : it->second)
      {
        pObser->handle(msgid);
      }
    }
  }
private:
  unordered_map<int, list<Observer*>> _subMap;
};
int main()
{
  Subject subject;
  Observer *p1 = new Observer1();
  Observer *p2 = new Observer2();
  Observer *p3 = new Observer3();
  subject.addObserver(p1, 1);
  subject.addObserver(p1, 2);
  subject.addObserver(p2, 2);
  subject.addObserver(p3, 1);
  subject.addObserver(p3, 3);
  int msgid = 0;
  for (;;)
  {
    cout << "输入消息id:";
    cin >> msgid;
    if (msgid == -1)
      break;
    subject.dispatch(msgid);
  }
  return 0;
}
相关文章
|
19天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
21 0
|
1月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
3月前
|
设计模式 存储 算法
Java 设计模式最佳实践:三、行为模式
Java 设计模式最佳实践:三、行为模式
22 0
|
2月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
16天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
22小时前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
8 2
|
4天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
4天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
6天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
13 0
|
16天前
|
设计模式 Java
小谈设计模式(9)—工厂方法模式
小谈设计模式(9)—工厂方法模式