本文参考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. Python笔记-built-in函数,文件操作,lambda函数
  2. debian8 配置使用 nfs
  3. Java命令行输入求和的简单学习
  4. WCF初探-19:WCF消息协定
  5. 一个按钮,如果5分钟内点击再次点击给予提示操作频繁,在JS里可以这样写
  6. Centos 中如何快速定制二进制的内核RPM 包
  7. Sql语句直接返回XML文件
  8. HTTP协议的状态码
  9. Android学习之——图形图像处理(Bitmap、BitmapFactory)(一)
  10. SQL竖表转横表 / 横表转竖表
  11. 《Machine Learning》系列学习笔记之第四周
  12. xcode编译报错unknown error -1=ffffffffffffffff Command /bin/sh failed with exit code 1
  13. HTTP 405 错误 – 方法不被允许 (Method not allowed)【转载】
  14. Hibernate (四)
  15. spring boot拦截器中获取request post请求中的参数
  16. 大受喜欢安卓触控一体机连接云端数据化管理提供例程DEMO
  17. python判断平台
  18. ranch 源码分析(二)
  19. Eclispe中编辑xml配置文件时不会提示也不能自动调整格式
  20. MT【84】夹逼定值

热门文章

  1. HDUOJ----1170Milk
  2. 给maven仓库添加镜像
  3. 能让你聪明的工作DEAL四法则,来自《每周工作四小时》书籍
  4. 分布式缓存技术memcached学习系列(二)——memcached基础命令
  5. 移动对meta的定义(转)
  6. Spring MVC+Mybatis 执行存储过程,使用Map进行参数的传递
  7. oc 异常处理
  8. service zabbix does not support chkconfig
  9. React dva 的使用
  10. Python 爬虫 数据提取