`

HeadFirst设计模式读书笔记--观察者模式(2)(二)

 
阅读更多

设计气象站(案例)


实现气象站
public interface Subject{
      /*
       *这两个方法都需要观察者作为变量,该观察者是用来注册或被删除的
      */
      public void registerObserver(Observer o);
       public void removeObserver(Observer o);
       //当主题状态改变时,这个方法会被调用,以通知所有的观察者
      public void notifyObserver(Observer o);
}
//所有的观察者都必须实现update()方法,
//以实现观察者接口。
//在这里,我们按照Mar和Sue的想法把观测值传入观察者中
public interface Observer{
           public void update(float temp,float humidity,float pressure);//当气象观测值改变时,主题会把这些状态值当作方法的参数,传给观察者
}


//DisplayElement接口只包含了一个方法,也就是display()方法。
//当布告板需要显示时,调用此方法。
public interface DisplayElement(){
       public void display();
}

在WeatherData中实现主题接口

//WeatherData现在实现了Subject接口
public class WeatherData implements Subject{
		private ArrayList observers;//我们加上了一个ArrayList来记录观察者,此ArrayList是在构造器中建立的。
		private float temperature;
		private float humidity;
		private float pressure;
		
		public WeatherData(){
			observers = new ArrayList();
		}
		
		//当注册观察者时,我们只要把他们加到ArrayList的后面即可。
		public void registerObserver(Observer o){
				observers.add(o);
		}
		
		//同样地,当观察者想取消注册,我们把他从ArrayList中删除即可。
		public void removeObserver(Observer o){
				int i=observers.indexOf(o);
				if(i>=0){
						observers.remove(i);
				}
		}
		
		//在这里,我们把状态告诉每一个观察者。因为观察者都实现了update()方法,所以我们知道如何通知他们。
		public void notifyObservers(){
				for(int i=0;i<observers.size();i++){
						Observer observer = (Observer)observers.get(i);
						observer.update(teperature,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();
		}
		//WeatherData的其他方法
}


现在,我们来建立布告板吧!

//此布告板实现了Observer接口,所以可以从WeatherData对象中获得改变
//它也实现了DisplayElement接口,因为我们的API规定所有的布告板都必须实现此接口
public class CurrentConditionsDisplay implements Observer,DisplayElement{
		private float temperature;
		private float humidity;
		private float Subject WeatherData;
		
		
		//构造器需要weatherData对象(也就是主题)作为注册之用
		public CurrentConditionsDisplay(Subject weatherData){
				this.weatherData = weatherData;
			  weatherData.registerObserver(this);
		}
		
		//当update()被调用时,我们把温度和湿度保存起来,然后调用display()
		public void update(float temperature,float humidity,float pressure){
				this.temperature=temperature;
				this.humidity=humidity;
				display();
		}
		
		//display()方法就只是把最近的温度和湿度显示出来
		public void Display(){
			System.out.println("Current conditions:"+temperature+"F degrees and"+humidity+"% humidity");
		}
}

启动气象站

1.先建立一个测试程序

public class WeatherStation{
		public static void main(String[] args){
				//首先,建立一个WeatherData对象
				WeatherData weatherData = new WeatherData();
				
				//建立三个布告板,并把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);
		}
}

2.运行程序,让观察者模式表演魔术


版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助开发者理解如何使用观察者模式来构建可扩展的系统。通过实际的代码示例,我们可以更深入地掌握这一模式,并将其应用到日常开发中,提升代码的...

    Head First设计模式读书笔记-DesignPatterns.zip

    《Head First设计模式》是一本深受开发者喜爱的设计模式学习书籍,它以易懂且生动的方式介绍了23种经典设计模式。这些模式是软件工程中经过实践验证的最佳实践,旨在提高代码的可重用性、可读性和可维护性。下面,...

    Head First 设计模式 扫描版

    《Head First 设计模式》是软件开发领域内一本广受欢迎的书籍,由Eric Freeman、Elisabeth Robson、Bert Bates和Kathy Sierra四位作者共同撰写。这本书以其独特的视觉风格和易于理解的教学方法,深入浅出地介绍了...

    HeadFirst设计模式笔记

    《HeadFirst设计模式笔记》是深入理解软件设计思想的一份宝贵资料,主要涵盖了设计模式这一核心编程概念。设计模式是经过实践验证的解决方案模板,用于解决在软件开发中经常遇到的问题,尤其在面向对象设计中。这篇...

    Head.First 设计模式学习笔记.pdf

    ### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...

    Head First 设计模式学习笔记(十四)模式的组合使用

    在《Head First 设计模式学习笔记(十四)模式的组合使用》中,作者探讨了如何在实际编程中灵活地组合多种设计模式以解决复杂问题。这篇文章可能是基于《Head First 设计模式》这本书的一个章节,该书是设计模式领域...

    head first 设计模式

    根据提供的信息,“Head First设计模式”是一本广受好评的设计模式书籍。虽然具体的章节内容没有给出,但从描述中得知本书的第22页至39页涵盖了重要的设计模式概念,因此我们将围绕这些页面可能涉及的设计模式进行...

    观察者模式

    在Head First的观察者模式学习笔记中,我们可以深入理解这个模式的原理和应用。首先,观察者模式涉及到两个主要的角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它可以是任何具有可变状态的对象...

    设计模式笔记

    《Head First设计模式》是一本非常受欢迎的设计模式入门书籍,通过生动有趣的图文方式帮助读者理解这些模式。 1. **策略模式**:策略模式是一种对象行为型模式,其核心思想是定义一系列算法,并将每个算法封装起来...

    head first C#学习笔记:如何创建事件

    在C#编程中,事件是实现对象间通信的重要机制,特别是在设计模式中,如观察者模式。本学习笔记将深入探讨如何在C#中创建事件,以实现一个棒球模拟系统的例子。在这个系统中,我们将关注投球手、观众和裁判的交互,当...

    一些非常好的文档PHP技术

    2. 设计模式:`《Head First 设计模式》代码之PHP版.txt` 提到了设计模式的概念,这是软件工程中的一种经验总结,用于解决常见的编程问题。PHP程序员可以通过学习设计模式来提升代码结构和可重用性,例如工厂模式、...

    LearningProcessForJava:Java的学习过程

    8. **设计模式**:学习常见的设计模式,如工厂模式、单例模式、观察者模式,提升代码质量和可维护性。 9. **JVM原理**:理解Java虚拟机的工作方式,包括内存管理、垃圾回收机制等。 10. **Spring框架**:掌握流行的...

Global site tag (gtag.js) - Google Analytics