设计模式:观察者模式(observer)-阿里云开发者社区

开发者社区> 重庆八怪> 正文

设计模式:观察者模式(observer)

简介: 设计模式:观察者模式(observer) 这种设计模式大量的使用,简单的说就是观察者通过被观察者来获得外界某种事物的状态 Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
+关注继续查看

设计模式:观察者模式(observer)

  • 这种设计模式大量的使用,简单的说就是观察者通过被观察者来获得外界某种事物的状态

  • Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
    如下图:


    554
    image.png
  • 被观察者(concreteSubject):其中必然包含了一个观察者的列表,用于状态发生变化的时候通过链表进行通知每个观察者做出相应的变化

  • 观察者(ConcreteObserver):其中必然包含各种应对外界状态变化的方法,以供被观察者调用

  • 图中还有抽象类Subject和Observer其具体的被观察者和观察者可以通过虚函数从写的方式来重写这些定义好的接口

那么我们做一个列子如下,比如上课的学生等待上课和下课的铃音,那么学生就是观察者上下课铃就是被观察者如下:

点击(此处)折叠或打开

  1. /*************************************************************************
  2.   > File Name: test.cpp
  3.   > Author: gaopeng QQ:22389860 all right reserved
  4.   > Mail: gaopp_200217@163.com
  5.   > Created Time: Sat 25 Nov 2017 05:13:21 AM CST
  6.  ************************************************************************/

  7. #include<iostream>
  8. #include "vector"
  9. #include "string"
  10. #include<string.h>

  11. using namespace std;


  12. class StuObserver
  13. {

  14.         private:
  15.                 char name[256];
  16.         public:
  17.                 StuObserver(const char* name)
  18.                 {
  19.                         cout<< name<<"加入学习班!"<<endl;
  20.                         strcpy(this->name,name);
  21.                 }
  22.                 int class_begin()
  23.                 {

  24.                         cout<<name<<" 上课开始学习!"<<endl;
  25.                         return 0;
  26.                 }
  27.                 int class_end()
  28.                 {

  29.                         cout<<name<<" 结束学习下课!"<<endl;
  30.                         return 0;
  31.                 }
  32. };


  33. class bell
  34. {

  35.         private:
  36.                 vector<StuObserver* > v;//包含所有观察者
  37.                 int i;
  38.         public:
  39.                 bell()
  40.                 {
  41.                         i = 0;
  42.                         v.clear();
  43.                 }
  44.                 ~ bell()
  45.                 {

  46.                         v.clear();
  47.                         for(i=0; i<v.size(); i++)
  48.                         {
  49.                                 delete v[i];
  50.                                 v[i]=NULL;
  51.                         }
  52.                 }
  53.                 int addObserver(StuObserver *o)
  54.                 {

  55.                         v.push_back(o);
  56.                         return 0;
  57.                 }

  58.                 int begin_class(const char* class_name)
  59.                 {

  60.                         cout<<"每位同学注意:"<<class_name<<"开始了上课了!!"<<endl;
  61.                         for(i=0; i<v.size(); i++)
  62.                         {

  63.                                 v[i]->class_begin();
  64.                         }
  65.                         return 0;
  66.                 }

  67.                 int end_class(const char* class_name)
  68.                 {

  69.                         cout<<"每位同学注意:"<<class_name<<"结束了下课了!!"<<endl;
  70.                         for(i=0; i<v.size(); i++)
  71.                         {

  72.                                 v[i]->class_end();
  73.                         }
  74.                         return 0;
  75.                 }
  76. };



  77. int main(void)
  78. {


  79.         bell m;
  80.         StuObserver* a=new StuObserver("高鹏1");
  81.         StuObserver* b=new StuObserver("高鹏2");
  82.         StuObserver* c=new StuObserver("高鹏3");
  83.         StuObserver* d=new StuObserver("高鹏4");

  84.         m.addObserver(a);
  85.         m.addObserver(b);
  86.         m.addObserver(c);
  87.         m.addObserver(d);

  88.         m.begin_class("数学");
  89.         m.end_class("数学");
  90.         m.begin_class("语文");
  91.         m.end_class("语文");
  92. }

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
7238 0
Net设计模式实例之观察者模式(Observer Pattern)
一、观察者模式简介(Brief Introduction) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化的时,会通知所有观察者对象,使他们能够自动更新自己。
644 0
ABF平台设计(六):微前端渲染框架-YseraMicroServer
YseraMicroServer 是基于qiankun的微前端平台化解决方案。他基于qiankun的沙箱能力、重新定义的通信机制和接入方式以及ui快照等能力,提供一种微前端快速接入的解决方案。本文将从业务背景、实现思路、运行机制等方面进行阐述。
16 0
[更新设计]跨平台物联网通讯框架ServerSuperIO 2.0 ,功能、BUG、细节说明,以及升级思考过程!
注:ServerSuperIO 2.0 还没有提交到开源社区,在内部测试!!! 1. ServerSuperIO(SSIO)说明      SSIO是基于早期工业现场300波特率通讯传输应用场景发展、演化而来。
530 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
8920 0
[转]设计模式-Observer
设计模式-Observer 1. 解决的问题:    假如现在要编写一个天气预报的公布栏, 公布栏有两种显示方式, 一种是图像方式显示, 一种是表格形式显示. 2. 问题分析:    应该根据数据与现实分离的原则将天气预报数据和现实形式分别封装起来,    今后可能增加其他的显示形式;    天气预报数据发生变化后,需要对所有的显示形式进行更新.
806 0
IOS设计模式第七篇之观察者设计模式
版权声明:原创作品,谢绝转载!否则将追究法律责任。 观察者设计模式 在观察者设计模式里面,一个对象通知其他的对象一些状态的改变。涉及这些对象不需要知道另一个对象---因此鼓励解耦设计模式。这个设计模式经常被用来通知感兴趣的对象当一个属性被改变时候。
740 0
设计模式之观察者模式
写作方法:    一般用于异步通讯1. 定义ObServer类   定义允许调用的虚函数,保护其他函数使不可见。
586 0
+关注
重庆八怪
10年ORACLE/MYSQL DBA,有一定C/C++基础
661
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载