设计模式:观察者模式(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. }

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

转载于:http://blog.itpub.net/7728585/viewspace-2148092/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值