设计模式:观察者模式(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. }
时间: 2024-09-20 15:40:02

设计模式:观察者模式(observer)的相关文章

设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

设计模式 ( 十五 ) 观察者模式Observer(对象行为型)    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改.也许,你只想根据你的具体应用环境而改进通信代码.或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属. 2.问题 当一个对象的状态发生改变时,你

乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:webabcd 介绍 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例 有一个Message实体类,某些对象对它的操作有Insert()方法,当发生某些改变的时候,通知所有这些对象并执行Insert()方法. MessageModel using

学习php设计模式 php实现观察者模式(Observer)_php技巧

一.意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新[GOF95] 又称为发布-订阅(Publish-Subscribe)模式.模型-视图(Model-View)模式.源-监听(Source-Listener)模式.或从属者(Dependents)模式二.观察者模式结构图   三.观察者模式中主要角色抽象主题(Subject)角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者.抽象主题提供了增加和删除观

.NET设计模式-观察者模式(Observer Pattern)

概述 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>] 结构图 图1 Observer模式

【设计模式】—— 观察者模式Observer

模式意图 观察者模式,也叫发布/订阅模式,从名字来说就能察觉到它的过程应该是,发布--其他人接受. 这个模式定义了对象之间的一种依赖关系,当一个对象发生变化时,其他的对象收到更新,也发生变化. 模拟我们订阅邮件这个场景,不管我们的邮箱是在登陆还是关闭,邮件都会发送到邮箱里面.只要把自己的邮箱订阅到这个邮件就可以了!这个模式也是这样一个过程. 这个模式代码相对来说比较容易理解,而且应用很广泛. 应用场景 1 当一个模型有几个展现方面,通过修改一个展现,顺便更新其他的.就好比一个网站的有web端,也

观察者模式 Observer

观察者模式 Observer 这是软件设计模式的一种. 又被称为: 发布-订阅<Publish/Subscribe>模式. 模型-视图<Model/View>模式. 源-收听者<Source/Listener>模式 或从属者<Dependents>模式) 观察者模式(Observer)完美的将观察者和被观察的对象分离开. 此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知. 这通常透过呼叫各观察者所提供的方法来实现.

观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove)\通知(notify)观察者; 观察者(observer)接口, 负责更新(update)数据; 主题(subject)接口: 注册观察者(registerObserver), 删除观察者(removeObserver), 通知观察者(

设计模式之禅之设计模式-观察者模式

一:观察者模式的定义        --->观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式        --->定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新 二:观察者模式的角色 ● Subject被观察者        定义被观察者必须实现的职责,它必须能够动态地增加.取消观察者.它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管

设计模式之观察者模式 (Observer Design Pattern)

一.什么是观察者模式 观察者定义了一种一对多的依赖关系,当一个主题(Subject)对象状态发生变化时,所有依赖它的相关对象都会得到通知并且能够自动更新自己的状态,这些依赖的对象称之为观察者(Observer)对象这类似于发布/订阅模式. 观察者模式中的主题对象,会维持着一个依赖它的观察者对象列表,当主题对象状态发生改变时,主题对象便会调用这个列表中所有观察者对象的方法. 观察者模式一般用在分布式时间处理系统,它也是流行的MVC模型的核心设计模式. 二.观察者模式中的角色 观察者模式主要涉及到三