`

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

阅读更多

 

UML详细图


良好的OO设计必须具备可复用、可扩展、可维护三个特性。

观察者模式:

       出版者+订阅者=观察者模式

       条件:订阅者向出版者订阅报纸; 出版者一旦有新报纸或有更新的报纸,就会给订阅者送达; 当订阅者不想再看报纸的时候,可取消订阅,这样出版者不再向取消订阅者送报纸; 只要报社还在运营,就会有人向他们订阅报纸。

       这里将出版者抽象为Subject(主题),将订阅者抽象为observer(观察者)

                

类似的求职者与猎头也可以这样抽象。如多个求职者打电话给猎头;猎头把他们加入求职列表之中,一旦有对应的职位就打电话通知相应的求职者;求职者也可以自己出去找工作,找到工作打电话告诉猎头不需要它帮助了,猎头把该求职者从求职列表中删除。

 

观察者模式的定义

       观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

观察者提供了一种对象设计,让主题和观察者之间松耦合。
在观察者模式中,主题与观察者之间是松耦合关系,增加观察者可删除观察者主题的代码不用修改,主题不会受任何影响。
设计原则四:为了交互对象之间的松耦合设计而努力。

实例一:天气预报,系统通过WeatherData获取观测到的数据,可能有多个布告板用来显示天气数据。当天气数据改变时要求实时更新布告板中的显示。要求程序员可以利用此API增加、删除自己的布告板及显示的内容。

此例符合观察者模式的要求。

天气预报系统的观察者模式图如下:

实现代码如下:

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

public interface Subject {
	
	void registerObserver(Observer o);
	void removeObserver(Observer o);
	void notifyObserver();
}

 

 

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

public interface Observer {

	void update();
}

 

 

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

import java.util.ArrayList;

public class WeatherData implements Subject{

	ArrayList observerList;
	private float temperature;
	private float humidity;
	private float pressure;
	
	
	
	public WeatherData(){
		observerList =  new ArrayList();
	}
	public void notifyObserver() {
		for(int i=0;i<observerList.size();i++){
			Observer o = (Observer)observerList.get(i);
			o.update();
		}
	}

	public void registerObserver(Observer o) {
		observerList.add(o);
	}

	public void removeObserver(Observer o) {
		int i = observerList.indexOf(o);
		if(i>=0){
			observerList.remove(o);
		}
	}
	
	public float getTemprature(){
		return temperature;
	}
	
	public float getHumidity(){
		return humidity;
	}
	
	public float getPressure(){
		return pressure;
	}
	
	public void measurementsChanged(){
		notifyObserver();
	}
	
	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.weatherdata;

public class CurrentConditionsDisplay implements Observer, DisplayElement {

	WeatherData weatherData;
	
	
	private float temperature;
	private float humidity;
	private float pressure;
	
	public CurrentConditionsDisplay(WeatherData weatherData){
		this.weatherData = weatherData;
		weatherData.registerObserver(this);
	}
	public void update() {
		this.temperature = weatherData.getTemprature();
		this.humidity = weatherData.getHumidity();
		this.pressure = weatherData.getPressure();
		this.display();
	}

	public void display() {

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

}

 

 

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

public interface DisplayElement {

	void display();
}

 

 

下面是测试类:

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

public class WeatherDataTest {

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

}

 

 

输出结果:

Temperature:12.0 Humidity:23.0 Pressure:24.0
Temperature:12.0 Humidity:23.0 Pressure:24.0
Temperature:45.0 Humidity:55.0 Pressure:77.0
Temperature:45.0 Humidity:55.0 Pressure:77.0
Temperature:13.0 Humidity:23.0 Pressure:24.0

 

上面实例源代码见附件:weatherdataSrc1.rar

分享到:
评论

相关推荐

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

    在本文中,我们将深入探讨设计模式中的"观察者模式",并以`WeatherData`为例进行具体实现。观察者模式是一种行为设计模式,它允许我们定义一个订阅机制,当对象状态发生变化时,可以通知所有依赖它的观察者。这种...

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

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

    java设计模式之观察者模式

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

    java实现观察者模式

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

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

    观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,`java.util.Observable`和`java.util.Observer`接口提供了...

    HeadFirst设计模式英文版

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

    设计模式培训-observer.pdf

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

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

    观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以及时地在对象之间传播状态变化。在Java中,观察者模式常用于构建事件驱动系统,使得多个对象能够监听并响应某个对象的状态改变。 首先,我们要理解...

    观察者模式简单例子

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

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

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

    观察者模式框架2

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

    java 观察者模式 demo

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

    观察者模式1Demo

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

    观察者模式代码

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

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

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

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

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

    Java 观察者模式

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

    Head_First设计模式

    面向对象编程(OOP)是一种流行的编程范式,它通过将问题抽象...《Head First设计模式》通过丰富的实例和详细的解释,深入浅出地介绍了面向对象设计中常用的设计模式,帮助读者更好地理解和应用这些重要的编程概念。

Global site tag (gtag.js) - Google Analytics