在软件工程中,设计模式(Design Pattern)是对软件设计普遍存在(反复出现)的各种问题,锁提出的解决防范。根据模式的目的来划分的话,GoF(Gang of Four) 设计模式可以分为以下三种类型:

1.创建型模式:用来描述“如何创建对象”,它的主要特点是“将对象的创建和使用分离”。包括单例、原型、工厂方法、抽象工厂和建造者5种模式。

2.结构型模式:用来描述如何将类或对象按照某种布局组成更大的结构。包括代理、适配器、侨接、装饰、外观、享元和组合7种模式。

3.行为型模式:用来识别对象之间的常用交流模式以及如何分配职责。包括模版方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录和解释器11种模式。

今天介绍1种常用的设计模式。

观察者模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使他们能够更新自己。

在观察者模式中有连个主要的角色:Subject(主题,被观察对象)和Observer(观察者)

被观察对象自身应该包含一个容器来存放观察者对象,当被观察者自身发生改变时通知容器内所有的观察者对象自动更新。

观察者对象可以注册到被观察者的中,完成注册后可以检测被观察者的变化,接收被观察者的通知。当然观察者也可以被注销换掉,停止对被观察者的监控。

/*关键代码:在目标类中增加一个ArrayList存放观察者们。
*/#include <iostream>#include <list>#include <memory>using namespace std;class View;//被观察者抽象类 数据模型class DataModel {public:virtual ~DataModel(){}virtual void addView(View *view) = 0;virtual void removeView(View* view) = 0;virtual void notif() = 0;  //通知函数};//观察者抽象类  视图
class View {public:virtual ~View() {cout << "~View()" << endl;}virtual void update() = 0;virtual void setViewName(const string& name) = 0;virtual const string& name() = 0;
}//具体的被观察类,整数模型
class IntDataModel:public DataModel {public:~IntDataModel() {m_pViewList.clear();}virtual void addView(View *view) override {shared_ptr<View> temp(view);auto iter = find(m_pViewList.begin(), m_pViewList.end(), temp);if (iter == m_pViewList.end()) {m_pViewList.push_font(temp);}else {cout << "View already exists" <<endl;}}
}void removeView(View* view) override {auto iter = m_pViewList.begin();for(;iter != m_pViewList.end(); iter++) {if((*iter).get() == view) {m_pViewList.erase(iter);cout << "remove view" << endl;return ;}}
}virtual void notify() override {auto iter = m_pViewList.begin();for(; iter != m_pViewList.end(); iter++) {(*iter).get()->update();}
}private:list<shared_ptr<View>> m_pViewList;
};//具体的观察者类 表视图
class TableView : public View {public:TableView() ; m_name("unknow"){}TableView(const string& name) : m_name(name){}~TableView(){cout << "~TableView():" << m_name.data() << endl;}void setViewName(const string& name) {m_name = name;}const string& name() {return m_name;}void update() override {cout << m_name.data() << " update" << endl;}private:string m_name;
};int main() {/*补充说明,在本次代码示例中,View一旦被注册到DataModel类之后,DataModel解析时会自动解析调内部容器中存储的View对象,因此注册后的View对象不需要在手动去delete,再去delete View对象会出错*/View *v1 = new TableView("TableView1");View *v2 = new TableView("TableView2");View *v3 = new TableView("TableView3");View *v4 = new TableView("TableView4");IntDataModel* model = new IntDataModel;model->addView(v1);model->addView(v2);model->addView(v3);model->addView(v4);model->notify();cout<<"---------------\n"<<endl;model->removeView(v1);model->notify();delete model;model = nullptr;return 0;
}

应用场景:

一个对象的行为依赖于另一个对象的状态。换一种方法,当被观察对象(目标对象)的状态发生改变时,会直接影响到观察对象的行为。


发布订阅模式

在软件架构中,发布/订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息发分为不同的类别,然后分别发送给不同的订阅者。同样的,订阅者可以表达对一个或多个类别的兴趣,只接受感兴趣的消息,无需了解哪些发布存在。

在发布订阅模式中有三个主要角色:Publisher(发布者)、Channels(通道)和Subscriber(订阅者)

可以理解为发布者主动发出特定的通道,观察者接收自己想要的。

C++设计模式之观察者模式和发布订阅模式相关推荐

  1. JavaScript 设计模式之观察者模式与发布订阅模式

    前言 在软体工程中,设计模式(design pattern)是对软体设计中普遍存在(反复出现)的各种问题,所提出的解决方案. 设计模式并不直接用来完成程式码的编写,而是描述在各种不同情况下,要怎么解决 ...

  2. 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?

    前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...

  3. js设计模式之观察者模式和发布/订阅模式

    观察者模式 The Observer is a design pattern where an object (known as a subject) maintains a list of obje ...

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

    观察者模式(发布-订阅模式)一个简单的使用 简介 例子 被监听者(被观察者) 监听者(观察者) 测试类 简介 观察者模式(有时又被称为模型(Model)-视图(View)模式.源-收听者(Listen ...

  5. 观察者模式VS发布-订阅模式

    前言 观察者模式的大名,想必各位看官早已有所耳闻.从我们现实生活来说,微信公众号订阅.医院挂号叫号等都属于它的实际应用.在程序世界中,它是一种用于将代码解耦的设计模式,如果你想掌握并理解这种设计模式, ...

  6. 观察者模式与发布/订阅模式的区别

    [原]观察者模式与发布/订阅模式的区别 不管是维基百科还是百度百科,搜索观察者模式,都会发现观察者模式的定义是观察者模式(有时又被称为发布/订阅模式),即一个目标对象管理所有相依于它的观察者对象,并且 ...

  7. 深入理解观察者模式与发布订阅模式

    观察者模式与发布订阅模式区别 (全文很长,认真读完相信你会有所收获) 纸上得来终觉浅 观察者模式与发布订阅模式区别 抽象模型 观察者模式 发布-订阅模式 结论 困惑 发布订阅模式?? jQuery的发 ...

  8. 观察者模式VS发布订阅模式

    一.前言 观察者模式vs发布/订阅模式很容易混淆,像是凤梨和菠萝,傻傻分不清.Observer模式通常用Publish/Subscribe模式实现,我刚开始学习js的时候,以为这是同一回事,但是仔细学 ...

  9. JS观察者模式和发布订阅模式

    观察者模式 观察者模式在前端工程中是很常见的设计模式,因为前端交互中充斥着大量多控件联动的交互,当参与联动的组件数量比较多或者组件数量可能变化的时候,代码就会变得难以维护.但是如果我们写代码时遵循了观 ...

最新文章

  1. SQLSERVER 分页
  2. OpenGL中的reshape函数(整理)
  3. 项目第二周冲刺第六天
  4. hdu 1255(线段树+离散化)
  5. openssl加密http网站过程1
  6. 微软简化 Windows 10 上的 WSL 安装
  7. jieba库词频统计_运用jieba库进行词频统计
  8. python怎么使用-Python中__all__作用何在以及如何使用?
  9. 用c语言写图书管理系统设计,C语言图书管理系统设计及实现.doc
  10. 单片机软件开发心得体会
  11. php 设置字符编码为utf-8
  12. 【自学与引导】 大数据技术 技能课程总结篇
  13. java大鱼吃小鱼实验报告摘要_java 大鱼吃小鱼游戏总结
  14. 红尘牵绊,江湖儿女惹情长
  15. 苹果设备尺寸和控件尺寸
  16. 【论文阅读】2021中国法研杯司法考试数据集研究(CAIL2021)
  17. Stack Overflow 宣布推出离线版本
  18. 2020短视频电商直播运营方案实战干货
  19. 【我的Android进阶之旅】 Android Studio 使用小技巧:快速Close Others其他的文件
  20. 蓝汛之,关于硬件设计导致的RF干扰GND导致产生的底噪问题【篇】

热门文章

  1. ASP.NET Web程序设计——WebPages
  2. 采用路由器应对天猫盒子
  3. python--连接oracle数据库
  4. sql分组按条件统计
  5. 我的英语学习经验与教训
  6. docker安装mysql,设置mysql初始密码
  7. 热门、爆款必备8个标题套路,再也不愁写标题了(2)
  8. emoji无法显示_解决应用中无法存储及显示Emoji表情的问题
  9. 台式机怎么装蓝牙模块_【硬件篇】第1期:配件选购基础知识(台式机)
  10. 【中秋征文】使用Python中秋节嫦娥投食小游戏《千里婵娟》