要点:

1、如何使用观察者模式:

对应使用这个模式的用户(main)来说,subject和observer这两个基类是不被关系的,在调用者(main)中只是有concreteSubject和concreteObserver这两个具体目标和具体观察者来构建对象和程序。

int _tmain(int argc, _TCHAR* argv [])
{
ConcreteSubject* CS = new ConcreteSubject();
ConcreteObserver* CO = new ConcreteObserver(CS);
ConcreteObserver* CO1 = new ConcreteObserver(CS);
UpdateData* UD = new UpdateData();
UD->FirstValue = 123;
UD->SecendValue = 456;
CS->SetData(UD);

return 0;
}

2、信息刷新的操作由谁发起

观察者和目标都可以发起数据刷新的操作,但是从习惯上来讲由目标来刷新数据更为直观合理。

3、代码实现的要点:

将目标基类对象(subject)作为一个参数传递到观察者具体类的构造函数中(ConcreteObserver.ConcreteObserver(Subject*)),然后将这个Subject对象作为ConcreteObserver的一个成员变量存储起来,而后调用这个成员变量的Attach方法,即把观察者注册给目标,就好比完成了把订报读者的地址信息注册到邮局一样。

ConcreteObserver::ConcreteObserver(Subject* s)
{
_subject = s;
_subject->AttachObserver(this);
}

5、程序的执行流程

  将观察者注册给目标,从而让目标知道谁需要更新数据。

  更新具体目标类对象的数据,更新方法由具体目标类对象调用目标基类的遍历方法,遍历所有注册的具体观察者对象,然后调用这些具体观察者的Update方法实现更新。

6、观察者模式和C#事件的关系

如果忽略委托的动态绑定函数的功能,事件编程模式和观察者模式是相同的。

事件的定义方(定义Event的类)就是目标,注册事件方法的地方就是观察者(即写xEvent+=***的地方)。

这样理解起来更直观:事件定义方(目标)只关心什么时候发数据。事件使用方只关心收到数据后要干什么。而定义方不用关心这些数据发出去后用于什么用途,使用方也不必关心什么时候会收到数据。而数据发给谁或者该接收谁的数据是由调用这个结构的用户来决定绑定关系的。

  在事件模式中只存在目标和调用者,即调用者就是观察者。而在观察者模式中有三个角色:调用者(main函数)、目标、观察者。

7、观察者模式通常用来实现MVC架构

C++源码下载

面向对象设计模式--观察者模式(Observer)的更多相关文章

  1. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  2. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  3. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

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

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

  5. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  6. 面向对象设计模式——观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  7. 设计模式--观察者模式Observer(对象行为型)

    一.观察者模式 观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新.观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多. ...

  8. 大话设计模式--观察者模式 Observer -- C++ 实现实例

    大话设计模式--1.观察者模式: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的 观察者对象,使他们能够自动更新自己. 使用场合: 当一 ...

  9. [工作中的设计模式]观察者模式observer

    一.模式解析 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式又叫订阅发布模式, ...

随机推荐

  1. Brainstorm in one sentence

    [1]佚名|台湾学生占领立法院 人會長大三次 第一次是發現世界不是為自己而轉的時候. 第二次是在發現即使再怎麼努力,終究還是有些事令人無能為力的時候. 第三次是在,明知道有些事可能會無能為力,但還是會 ...

  2. jquery商城购物车右侧悬浮加入购物车动画效果

    <script type="text/javascript" src="js/jquery-1.7.min.js"></script> ...

  3. MySQL 参数autoReconnect=true 解决8小时连接失效

    <!--  dataSource加参数    处理mysql 8小时自动断开连接的问题 --> <property name="testWhileIdle" va ...

  4. 异步IO/数据库/队列/缓存

    同步与异步的性能区别  mport gevent def task(pid): """ Some non-deterministic task ""& ...

  5. Linux 下 Lua 与 LuaSQL 模块安装

    相关说明: Lua最近在Nginx的web服务器上挺火的, 它的高效让更多开发喜欢上它, 本文讲述Lua与LuaSQL的安装. 在上几篇mysql-proxy的安装中有提到和操作过. 操作系统: Li ...

  6. web-api-global-error-handling

    http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling http://www.cnblogs. ...

  7. CUDA编程

    目录: 1.什么是CUDA 2.为什么要用到CUDA 3.CUDA环境搭建 4.第一个CUDA程序 5. CUDA编程 5.1. 基本概念 5.2. 线程层次结构 5.3. 存储器层次结构 5.4. ...

  8. Unity3D研究院之Machine动画脚本自动生成AnimatorController(七十一)

    以前的项目一直不敢用Machine动画,因为当时立项的时候Machine动画还不成熟,最近项目做得差不多了我能有点时间学习,我就想在研究学习学习Machine.用Machine动画的时候需要创建一个A ...

  9. C#学习之初步理解委托、事件、匿名方法和Lambda

    最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对 ...

  10. 如何用ABBYY把PDF转换成PPT

    在电子科技迅速发展的今天,文件格式转换并不是什么稀罕事,因为现在都是电子化办公,出现很多文件格式,但是不同的场合需要的格式不同,所以常常需要进行文件格式的转换.PDF转换成PPT也是众多文件格式转换中 ...