`

深入浅出设计模式二——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`为例进行具体实现。观察者模式是一种行为设计模式,它允许我们定义一个订阅机制,当对象状态发生变化时,可以通知所有依赖它的观察者。这种...

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

    ### 设计模式——观察者模式详解 #### 一、引言 在软件工程领域,设计模式是一种被广泛采用的方法论,用于解决常见的编程问题。本文将深入探讨《设计模式(极力推荐)》这本书中提到的一个关键模式——观察者模式。...

    iOS版微信抢红包Tweak.zip小程序

    iOS版微信抢红包Tweak.zip小程序

    毕业设计&课设_篮球爱好者网站,含前后台管理功能及多种篮球相关内容展示.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    基于springboot社区停车信息管理系统.zip

    基于springboot社区停车信息管理系统.zip

    基于springboot南皮站化验室管理系统源码数据库文档.zip

    基于springboot南皮站化验室管理系统源码数据库文档.zip

    重磅,更新!!!上市公司全要素生产率TFP数据及测算方法(OL、FE、LP、OP、GMM)(2000-2023年)

    ## 数据指标说明 全要素生产率(TFP)也可以称之为系统生产率。指生产单位(主要为企业)作为系统中的各个要素的综合生产率,以区别于要素生产率(如技术生产率)。测算公式为:全要素生产率=产出总量/全部资源投入量。 数据测算:包含OL、FE、LP、OP、GMM共五种TFP测算方法!数据结果包括excel和dta格式,其中重要指标包括证券代码,固定资产净额,营业总收入,营业收入,营业成本,销售费用,管理费用,财务费用,购建固定资产无形资产和其他长期资产支付的现金,支付给职工以及为职工支付的现金,员工人数,折旧摊销,行业代码,上市日期,AB股交叉码,退市日期,年末是否ST或PT等变量指标分析。文件包括计算方法说明及原始数据和代码。 数据名称:上市公司全要素生产率TFP数据及测算方法(OL、FE、LP、OP、GMM) 数据年份:2000-2023年 数据指标:证券代码、year、TFP_OLS、TFP_FE、TFP_LP1、TFP_OP、TFP_OPacf、TFP_GMM

    多种编程语言下算法实现资源汇总

    内容概要:本文详细总结了多种编程语言下常用的算法实现资源,涵盖Python、C++、Java等流行编程语言及其相关的开源平台、在线课程和权威书籍。对于每种语言而言,均提供了具体资源列表,包括开源项目、标准库支持、在线课程及专业书籍推荐。 适合人群:适用于所有希望深入研究并提高特定编程语言算法能力的学习者,无论是编程新手还是有一定经验的技术人员。 使用场景及目标:帮助开发者快速定位到合适的算法学习资料,无论是出于个人兴趣自学、面试准备或是实际工作中遇到的具体算法问题,都能找到合适的解决方案。 其他说明:文中提及多个在线学习平台和社区网站,不仅限于某一特定语言,对于跨学科或多元化技能培养也具有很高的参考价值。

    基于springboot的交通旅游订票系统源码数据库文档.zip

    基于springboot的交通旅游订票系统源码数据库文档.zip

    GO语言教程:基础知识与并发编程

    内容概要:本文档是一份详细的GO语言教程,涵盖了Go语言的基础语法、数据类型、控制结构、函数、结构体、接口以及并发编程等多个方面。主要内容包括Go语言的基本概念和历史背景、环境配置、基本语法(如变量、数据类型、控制结构)、函数定义与调用、高级特性(如闭包、可变参数)、自定义数据类型(如结构体、接口)以及并发编程(如goroutine、channel、select)等内容。每部分内容都附有具体的代码示例,帮助读者理解和掌握相关知识点。 适合人群:具备一定编程基础的开发者,尤其是希望深入学习和应用Go语言的技术人员。 使用场景及目标:①初学者通过本教程快速入门Go语言;②有一定经验的开发者系统复习和完善Go语言知识;③实际项目开发中利用Go语言解决高性能、高并发的编程问题。 阅读建议:本文档全面介绍了Go语言的各项基础知识和技术细节,建议按章节顺序逐步学习,通过动手实践代码示例加深理解。对于复杂的概念和技术点,可以通过查阅更多资料或进行深入研究来巩固知识。

    time_series_at_a_point.ipynb

    GEE训练教程

    memcached笔记资料

    memcached笔记资料,配套视频:https://www.bilibili.com/list/474327672?sid=4486766&spm_id_from=333.999.0.0&desc=1

    基于springboot校内跑腿业务系统源码数据库文档.zip

    基于springboot校内跑腿业务系统源码数据库文档.zip

    计算机控制光感自动窗帘控制系统设计.doc

    计算机控制光感自动窗帘控制系统设计.doc

    基于SpringBoot的校园服务系统源码数据库文档.zip

    基于SpringBoot的校园服务系统源码数据库文档.zip

    基于SpringBoot+Vue的美容店信息管理系统源码数据库文档.zip

    基于SpringBoot+Vue的美容店信息管理系统源码数据库文档.zip

    基于springboot程序设计基础课程辅助教学系统源码数据库文档.zip

    基于springboot程序设计基础课程辅助教学系统源码数据库文档.zip

    原生JS实现斗地主小游戏源码.zip

    这是一个原生的JS网页版斗地主小游戏,代码注释全。带有斗地主游戏基本的地主、选牌、提示、出牌、倒计时等功能。简单好玩,欢迎下载

    基于springboot亚运会志愿者管理系统源码数据库文档.zip

    基于springboot亚运会志愿者管理系统源码数据库文档.zip

Global site tag (gtag.js) - Google Analytics