博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-观察者模式(上)<转>
阅读量:6913 次
发布时间:2019-06-27

本文共 1513 字,大约阅读时间需要 5 分钟。

本文参考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://uencl.baihongyu.com/

你可能感兴趣的文章
record-05 函数
查看>>
TF-IDF与余弦相似性的应用(一):自动提取关键词
查看>>
web2py官方文档翻译01
查看>>
.NET Framework 4.5 五个新特性
查看>>
随机梯度下降法优化实例
查看>>
自己动手制作一个本地的yum仓库
查看>>
2015年毕业生收到的offer和薪资透露
查看>>
新手老手都离不开八大开发工具
查看>>
Ubuntu下用命令行快速打开各类型文件(转)
查看>>
C语言程序设计_zju——第3周编程练习1_时间换算
查看>>
Nodejs调用Aras Innovator服务,处理AML并返回AML
查看>>
纯数学教程 Page 324 正项级数绝对收敛的一种判别法
查看>>
解析函數論 Page 29 命題(1) 有界閉集上的一致連續性
查看>>
oracle 两个timstamp类型相减获取时间差
查看>>
简单工厂设计模式-模拟磁盘打开文件
查看>>
C#实体类get和set的作用
查看>>
表单验证<AngularJs>
查看>>
18.os模块获取url后缀
查看>>
精通正则表达式之正则引擎
查看>>
apache安装的一些问题
查看>>