`

深入浅出设计模式二——WeatherData设计(观察者模式)实现二

阅读更多

在上文:深入浅出设计模式二——WeatherData设计(观察者模式)实现一

我们利用了自己缩写的Subject和Observer类完成了天气预报系统。

在JAVA API中已有写好的观察者模式供我们使用,本文将利用它们重新写一个天气预报系统。

在java.util包中有两个类可观察者Observable和观察者Observer。分别相当于Subject类和Observer类。

在Observable类中已经实现了addObserver,deleteObserver,notifyObservers方法,需要注意的是notifyObservers调用前需要调用setChanged标志状态改变,如果要清除状态改变标志则调用clearChanged方法。

 

UML图如下:

代码如下:

package com.lwf.disign.learn.observer.weatherdata2;

import java.util.Observable;

public class WeatherData extends Observable{

	private float temperature;
	private float humidity;
	private float pressure;
	
	public WeatherData(){}
		
	public float getTemprature(){
		return temperature;
	}
	
	public float getHumidity(){
		return humidity;
	}
	
	public float getPressure(){
		return pressure;
	}
	
	public void measurementsChanged(){
		setChanged();
		notifyObservers();
	}
	
	public void setMeasurements(float temperature,float humidity,float pressure){
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}

}

 

 

package com.lwf.disign.learn.observer.weatherdata2;

import java.util.Observable;
import java.util.Observer;

public class CurrentConditionsDisplay implements Observer {

	Observable observable;
	
	
	private float temperature;
	private float humidity;
	private float pressure;
	
	public CurrentConditionsDisplay(Observable observable){
		this.observable = observable;
		observable.addObserver(this);
	}
	public void update(Observable obs,Object arg) {
		if (obs instanceof WeatherData) {
			WeatherData weatherData = (WeatherData)obs;
			this.temperature = weatherData.getTemprature();
			this.humidity = weatherData.getHumidity();
			this.pressure = weatherData.getPressure();
			display();
		}
	}

	public void display() {

		System.out.println("Temperature:" + temperature + " Humidity:"
				+ humidity + " Pressure:" + pressure);
	}

}

 

测试类:

package com.lwf.disign.learn.observer.weatherdata2;

public class WeatherDataTest {

	public static void main(String[] args) {
		
		WeatherData weatherData = new WeatherData();
		CurrentConditionsDisplay o1 = new CurrentConditionsDisplay(weatherData);
		weatherData.setMeasurements(12, 23, 24);
		weatherData.setMeasurements(42, 55, 77);
		weatherData.setMeasurements(43, 55, 77);
		weatherData.setMeasurements(44, 55, 77);
		weatherData.setMeasurements(45, 55, 77);
		weatherData.setMeasurements(46, 55, 77);
	}

}

 

输出结果为:

Temperature:12.0 Humidity:23.0 Pressure:24.0
Temperature:42.0 Humidity:55.0 Pressure:77.0
Temperature:43.0 Humidity:55.0 Pressure:77.0
Temperature:44.0 Humidity:55.0 Pressure:77.0
Temperature:45.0 Humidity:55.0 Pressure:77.0
Temperature:46.0 Humidity:55.0 Pressure:77.0

 

 

附件有代码文件。

 

关注变化:

       我们看到JAVA内置的Observer模式的实现,它的Observable是一个类而不是一个接口,那么这个设计违背了面向接口编程,而不是面向实现编程的原则。所以如果当你需要从多个类继承的时候那么就不能使用Observale了。所以如果那种情况的话只能象weatherData的第一个实现一样,自己定义一个Subject接口。

其它JAVA类库使用观察者模式的情况

在JAVA SWING中使用的事件模型,给按钮添加事件的行为即是观察者模式。如下例:

package com.lwf.disign.learn.observer.weatherdata2;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class SwingObserverExample {

	JFrame frame;
	public static void main(String[] args) {
		
		SwingObserverExample s = new SwingObserverExample();
		s.go();
	}
	
	public void go(){
		frame = new JFrame();
		JButton button = new JButton("should i do");
		button.addActionListener(new AngleListener());
		button.addActionListener(new DeviListener());
		frame.getContentPane().add(BorderLayout.CENTER,button);
		frame.setVisible(true);
	}

	


	class AngleListener implements ActionListener{
	
		public void actionPerformed(ActionEvent e) {
			System.out.println("anglelistener");
		}
		
	}
	
	class DeviListener implements ActionListener{
	
		public void actionPerformed(ActionEvent e) {
			System.out.println("deviListener");
		}
		
	}
}

 

按钮通过addActionListener把每个观察者加入观察列表。一旦状态发生改变,则触发事件。

 

分享到:
评论

相关推荐

    深入浅出设计模式二——WeatherData设计(观察者模式)实现一

    在本文中,我们将深入探讨设计模式中的一个经典案例——观察者模式(Observer Pattern),通过具体的实现来理解其工作原理。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    深入浅出设计模式之观察者模式总结(二)附例子

    **观察者模式**是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这个模式在各种编程语言中都有广泛应用,包括Java、C#...

    java设计模式之观察者模式

    Java设计模式是软件开发中的重要概念,它们是解决常见编程问题的经验总结,使得代码更加...在给定的压缩包文件中,可能包含了更多关于如何在实际项目中应用观察者模式的详细代码示例,这将有助于深入理解这一设计模式。

    java实现观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件驱动的系统或者实时...

    Java常用的3中设计模式代码即工厂模式、单例模式、观察者模式demo

    以上是关于工厂模式、单例模式和观察者模式的基本介绍和Java实现。这些设计模式在实际编程中有着广泛的应用,能帮助我们编写出更灵活、可维护的代码。在学习和使用这些模式时,应根据具体场景选择最适合的实现方式,...

    HeadFirst设计模式英文版

    《Head First 设计模式》的英文版是一本面向初学者的设计模式入门书籍,它以幽默风趣的文风,深入浅出地介绍了软件设计中经常使用的设计模式。设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的...

    设计模式---观察者模式

    让我们深入探讨如何实现观察者模式: 1. **创建 Observable 类**:首先,你需要创建一个类继承自 `java.util.Observable`。这个类将作为被观察的对象,它需要维护状态,并在状态改变时通知观察者。例如,你可以创建...

    设计模式培训-observer.pdf

    本篇将深入探讨观察者模式的核心概念、实现原理及应用案例,旨在帮助初学者理解并掌握这一重要设计模式。 #### 观察者模式概述 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。...

    设计模式(极力推荐)第二部分

    在本书中,作者通过一个具体的案例——Weather-O-Rama气象站项目,深入浅出地讲解了观察者模式的实际应用。 **1. 项目背景** - **目标**: 构建一个下一代Internet气象观测站。 - **需求**: 需要实现三种不同的气象...

    观察者模式简单例子

    观察者模式是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在这个"观察者模式简单例子"中,我们将通过一个天气预报...

    观察者模式框架2

    观察者模式是一种非常实用的设计模式,尤其适合于实现事件驱动系统或需要动态更新数据的应用场景。通过本篇介绍的小型观察者模式框架,开发者可以快速地将观察者模式应用到实际项目中,提高系统的灵活性和可维护性。

    java 观察者模式 demo

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的编程模型...

    观察者模式代码

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。...

    观察者模式1Demo

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件处理、发布/订阅系统、以及...

    [行为模式]head first 设计模式之观察者模式(observer)

    **观察者模式(Observer Pattern)**是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...

    请根据观察者模式,用Java语言设计并实现气象站程序。

    请根据观察者模式,用Java语言设计并实现气象站程序。其中,部分代码已经写好,包括: • 观察者接口 • 主题接口 • 显示板接口 • 测试程序 请在此框架下,继续完成CurrentConditionsDisplay、ForecastDisplay...

    Java 观察者模式

    观察者模式是一种设计模式,主要用于在对象之间建立一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在这个气象站监测的例子中,观察者模式被用来处理气象数据的...

Global site tag (gtag.js) - Google Analytics