1. 首页
  2. IT资讯

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

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

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

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


    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. }

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-2148092/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:深沉的少年,转转请注明出处:http://www.cxybcw.com/183488.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code