`

观察者模式小结

F# 
阅读更多
  最近在阅读经典的著作<<head first design pattern>>中文版,觉得老外的著作真是太牛了,十分生动.先是复习了观察者模式,下面用书中
的例子小结之.
   观察者模式的要点在于,有主题和观察者,主题是"一"方,观察者有很多个,是"多"方,当主题一方有变化时,会通知观察者.
书中的例子是有一个weatherdata对象,有温度,湿度,气压等参数,其中要通知三个不同的观察者,三个观察者要以不同的方式去展示这些数据.

首先是主题接口(subject.java)

package headfirst.observer.weather;

public interface Subject {
 public void registerObserver(Observer o);
 public void removeObserver(Observer o);
 public void notifyObservers();
}
这里实现了注册,移除,和通知各观察者的接口.

观察者接口:

package headfirst.observer.weather;

public interface Observer {
 public void update(float temp, float humidity, float pressure);
}

观察者的显示方式接口,因为各观察者会以不同的方式实现该接口

package headfirst.observer.weather;

public interface DisplayElement {
 public void display();
}

在weatherdata中,实现subject接口

package headfirst.observer.weather;

import java.util.*;

public class WeatherData implements Subject {
 private ArrayList observers;
 private float temperature;
 private float humidity;
 private float pressure;
 
 public WeatherData() {
  observers = new ArrayList();
 }
 
 public void registerObserver(Observer o) {
  observers.add(o);
 }
 
 public void removeObserver(Observer o) {
  int i = observers.indexOf(o);
  if (i >= 0) {
   observers.remove(i);
  }
 }
 

//通知每个观察者
 public void notifyObservers() {
  for (int i = 0; i < observers.size(); i++) {
   Observer observer = (Observer)observers.get(i);
   observer.update(temperature, humidity, pressure);
  }
 }
 
 public void measurementsChanged() {
  notifyObservers();
 }
 
 public void setMeasurements(float temperature, float humidity, float pressure) {
  this.temperature = temperature;
  this.humidity = humidity;
  this.pressure = pressure;
  measurementsChanged();
 }
 
 // other WeatherData methods here
 
 public float getTemperature() {
  return temperature;
 }
 
 public float getHumidity() {
  return humidity;
 }
 
 public float getPressure() {
  return pressure;
 }
}


建立其中一个观察者
package headfirst.observer.weather;
 
public class CurrentConditionsDisplay implements Observer, DisplayElement {
 private float temperature;
 private float humidity;
 private Subject weatherData;
 

//注册观察者
 public CurrentConditionsDisplay(Subject weatherData) {
  this.weatherData = weatherData;
  weatherData.registerObserver(this);
 }
 
 public void update(float temperature, float humidity, float pressure) {
  this.temperature = temperature;
  this.humidity = humidity;
  display();
 }
 
 public void display() {
  System.out.println("Current conditions: " + temperature
   + "F degrees and " + humidity + "% humidity");
 }
}


客户端:

package headfirst.observer.weather;

import java.util.*;

public class WeatherStation {

 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);

  weatherData.setMeasurements(80, 65, 30.4f);
  weatherData.setMeasurements(82, 70, 29.2f);
  weatherData.setMeasurements(78, 90, 29.2f);
 }
}

分享到:
评论

相关推荐

    JavaScript模式中文[pdf] 百度云

    第1章 简介  模式  JavaScript:基本概念  ECMAScript 5 ... 观察者模式  小结  第8章 DOM和浏览器模式  关注分离  DOM脚本  事件  长期运行脚本  远程脚本  配置JavaScript  载入策略

    JavaScript模式 斯托扬·斯特凡洛夫 著

    前言 第1章 简介 模式 JavaScript:基本概念 ECMAScript JSLint Co ole 第2章 基本技巧 ...观察者模式 小结 第8章 DOM和浏览器模式 关注分离 DOM脚本 事件 长期运行脚本 远程脚本 酉己置JavaScript 载入策略 小结

    php设计模式小结

    观察者模式是一种行为设计模式,允许你定义一个订阅机制,当对象状态改变时,通知所有“观察”该对象的其他对象。在PHP中,这种模式常用于事件驱动编程,例如,当用户提交表单时发送邮件通知。 ```php interface ...

    设计模式小结

    6. **观察者模式**:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 7. **装饰器模式**:动态地给一个对象添加一些额外的职责,既扩展了功能,又不破坏...

    sunzhaoye#blog#观察者模式1

    // 如果先订阅,则直接订阅后发布// 如果先发布后订阅,则把发布的事件类型与参数保存起来,等到有订阅后执行订阅小结:发布订阅模式可以使代码解耦,满足开放封闭原

    设计模式小结.docx

    7. 观察者模式:定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 8. 状态模式:允许对象在其内部状态改变时改变其行为,看起来好像对象改变了它的类。 9. ...

    java设计模式

    22.4.1 Java世界中的观察者模式 22.4.2 项目中真实观察者模式 22.4.3 订阅发布模型 22.5 最佳实践 第23章 门面模式 23.1 我要投递信件 23.2 门面模式的定义 23.3 门面模式的应用 23.3.1 门面模式的优点 23.3.2 门面...

    ActionScript 3.0设计模式扫描版_方红琴译

    观察者模式中关键的00P概念 观察者模式最小化示例 实例:添加状态并标识用户 动态地改变状态 实例:采用不同的形式显示数据 小结 第9章 模板方法模式 什么是模板方法模式7 模板方法用到的主要()OP概念 最小...

    Delphi模式编程第一分卷

    22.3.1 观察者模式在界面色彩主题中的应用 22.3.2 范例小结 第23章 状态模式(State) 23.1 模式解说 23.2 结构与用法 23.2.1 模式结构 23.2.2 代码模板 23.2.3 问题讨论 23.3 范例与实践 23.3.1 状态模式...

    Delphi模式编程第二分卷

    22.3.1 观察者模式在界面色彩主题中的应用 22.3.2 范例小结 第23章 状态模式(State) 23.1 模式解说 23.2 结构与用法 23.2.1 模式结构 23.2.2 代码模板 23.2.3 问题讨论 23.3 范例与实践 23.3.1 ...

    软件设计(设计模式)课程实验报告.docx

    行为型设计模式主要关注对象之间的交互和责任分配,如策略模式、模板方法模式、观察者模式、访问者模式、责任链模式、命令模式、迭代器模式、备忘录模式、状态模式和解释器模式。这些模式在解决复杂的控制流程和行为...

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理1

    * 观察者模式:在 Tomcat 中,观察者模式被用于实现事件驱动的编程,例如 Lifecycle 事件的监听和处理。 * Singleton 模式:在 Tomcat 中,Singleton 模式被用于确保单例对象的唯一性,例如 Engine 和 Host 的实例。...

    UML 与 设计模式

    如果需要处理事件,观察者模式可能是个好选择。 10.10 模式应用举例:形状编辑器 在开发一个形状编辑器时,可以使用组合模式来构建复杂的形状结构,工厂模式用于创建形状对象,而命令模式可用于实现撤销/重做功能,...

    常用的Javascript设计模式小结

    【JavaScript设计模式小结】 设计模式是解决特定编程问题的标准化解决方案,它们是经验的积累,可以帮助开发者写出可维护、可扩展的代码。在JavaScript这种动态类型的脚本语言中,设计模式的应用略有不同,因为其...

    程序设计模式与架构

    行为型模式包括但不限于策略模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、模板方法模式和访问者模式等。 #### 网站开发架构模式 网站开发架构模式是指用于构建网站的通用结构和...

    C#23种设计模式_示例源代码及PDF

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

Global site tag (gtag.js) - Google Analytics