本文参考Head First设计模式一书,感觉书中的例子实在很好,很贴切。对模式的知识点进行总结,并对书的源码做了一定注释。
 
观察者模式要点有二:主题和观察者。
最贴切的案例是:杂志订阅,杂志是主题,观察者是订阅者。当出版新杂志时候,这个事件会自动通知所有的订阅者。
根据OO基本原则,应该针对接口编程(当然原因很多),主题和订阅者一般都作为接口。
 
下面是Head First的例子,是一个气象站,用户订阅气象信息的服务。
 
并且,最终用户所要的信息可能是:
 
针对这个需求,应用观察者模式来实现:
但是这个只是一个主题与观察者的设计,观察者自身还需要将信息显示出去。那么再用一个接口,专门来实现展示的功能。
 
 
实际上,上面的DisplayElement接口用再此处,本质上是策略模式的应用。
 
理解每个模式的特点对交流和设计都有很大帮助,当OO思想境修炼到很高的程度时,应该是忘掉所有的模式,而可以根据需要做出最佳设计,这个程度可以算手中无剑,心中有剑的地步。
 
下面是源码,只列出接口:
/** 
* 主题 
*/ 
public interface Subject { 
  public void registerObserver(Observer o); 
  public void removeObserver(Observer o); 
  public void notifyObservers(); 
}
 
/** 
* 观察者 
*/ 
public interface Observer { 
  public void update(float temp, float humidity, float pressure); 
}
 
/** 
* 布告板 
*/ 
public interface DisplayElement { 
  public void display(); 
}
 
测试main方法:
  public static void main(String[] args) { 
                //创建主题 
    WeatherData weatherData = new WeatherData(); 
                //创建三个观察者 
    CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); 
    StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); 
    ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); 
    HeatIndexDisplay heatIndexDisplay = new HeatIndexDisplay(weatherData); 
                //进行气象测量,主题的状态会因为测量值而改变 
    weatherData.setMeasurements(80, 65, 30.4f); 
    weatherData.setMeasurements(82, 70, 29.2f); 
    weatherData.setMeasurements(78, 90, 29.2f); 
  }
 
本例仅仅是为了说明这种模式,设计还远不够完美。实际上,主题中应该有一个线程去扫描状态的变化,当变化了,自动去调用measurementsChanged()方法。
 
观察者模式使用很普遍,GUI编程中事件注册就是典型的观察者模式的应用。
 
以上是自己实现的观察者模式,下文将讲述JDK所实现的观察者模式。

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/201617

设计模式-观察者模式(上)<转>的更多相关文章

  1. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

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

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

  3. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...

  4. 18. 星际争霸之php设计模式--观察者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  5. 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)

    朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上) [下载本文PDF进行阅读] 设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践.在经过多年的软件开发实践之后,回过头来去看23种设 ...

  6. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  7. javascript 设计模式-----观察者模式

    观察者模式在设计模式中被重点提到,因为它应用的场景非常多,而且在模块化设计当中扮演着非常重要的角色.MVC模式中最底层的就是观察者模式,当下流行的javascript框架backbone就是很好地运用 ...

  8. c#设计模式-观察者模式

    Observer 与 Subject 互为耦合,但是这种耦合的双方都依赖于抽象,而不依赖于具体. 一.观察者模式 目的 我们都知道解决一个问题有N种解决方式,但在面向对象的设计中如何能做到“高内聚,低 ...

  9. IOS设计模式-观察者模式

    前言:23种软件设计模式中的观察者模式,也是在软件开发中,挺常用的一种设计模式.而在苹果开发中,苹果Cocoa框架已经给我们实现了这个设 计模式,那就是通知和KVO(Key-Value Observi ...

随机推荐

  1. iOS获取手机型号,Swift获取手机型号(类似iphone 7这种,检测机型具体型号)

    获取手机设备信息,如name.model.version等, 但如果想获取具体的手机型号,如iphone5.5s这种,就需要如下这种(含Swift和OC两种写法) Swift建议添加到extensio ...

  2. O(n)复杂度求没有出现的数字(leetcode448)

    一个长度为N的数组,其中元素取值为1-N,求这个数组中没有出现的.1-N之间的数字. 要求无额外空间,O(n)时间复杂度. nums[i]=-1表示i数字已经出现过了 class Solution(o ...

  3. 【LeetCode】64. Minimum Path Sum

    Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...

  4. C#搞工控的一些代码

    首先工控项目都会用到: using System.Runtime.InteropServices; 1.字节转化为单精度浮点数 2.单精度转成字节 3.使用结构体 4.使用动态链接库 5.ASCCII ...

  5. 【Linux】正确的关机方法

    1)shutdown命令 我们较常使用的是shutdown这个命令,这个命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息.该命令还允许用户指定一个时间参数 ...

  6. Form_Form Builder的常用变量(概念)

    2014-12-30 Created By BaoXinjian

  7. nginx实战四

    nginx负载均衡 Nginx通过upstream和proxy_pass实现了负载均衡.本质上也是Nginx的反向代理功能,只不过后端的server为多个. 1.简单的轮询 upstream www ...

  8. MySQL使用伪列

    在查询数据库的时候,我们有时候需要对查询出来的数据加上序列,1,2,3,……n 例如:我们根据表的某个字段排序后,要对这些数据加上序列,这个时候序号常常不是我们建表时设置好的自增的主键id,怎么办呢? ...

  9. unity physics joint

    除了unity文档(有点儿过于简略)之外,可以参考一下PhysX文档: http://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/ ...

  10. 开源的报表系统easyreport的部署

    https://github.com/xianrendzw/EasyReport/blob/master/docs/manual/version2_0.md