天气预报项目中的观察者模式分析
Posted xumengqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了天气预报项目中的观察者模式分析相关的知识,希望对你有一定的参考价值。
一.观察者模式简介
又称为发布/订阅模式,它是软件设计模式中的一种。观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
二.观察者模式适用场合
- 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,需要将这两个方面分别封装到独立的对象中,彼此独立地改变和复用的时候。
- 当一个系统中一个对象的改变需要同时改变其他对象内容,但是又不知道待改变的对象到底有多少个的时候。
- 当一个对象的改变必须通知其他对象做出相应的变化,但是不能确定通知的对象是谁的时候。
三.天气预报demo中的观察者模式
1.地址:https://github.com/cyy3900/ObserverPattern/tree/master/ObserverPattern/src/com/cyy
2.架构:
如图,天气预报DEMO主要包括三个部分:气象站、天气数据、显示当前天气的公告牌。当气象站发布新的数据时,公告牌上的数据必须实时更新。显然,公告牌是观察者,而气象站是被观察者。当气象站的状态改变时,公告牌会得到通知。
3.观察者模式下的天气预报类图
4.代码分析
主题接口:
public interface Subject { //信息发布者 public void registerObserver(Observer o);//注册监听器 public void removeObserver(Observer o);//移除监听器 public void notifyObservers();//发送消息
观察者接口:
public interface Observer { public void update(float temperature,float humidity,float pressure);//状态改变的时候接收通知 }
显示接口:
public interface DisplayElement { public void display(); }
CurrentConditionDisplay
public class CurrentConditionDisplay implements Observer, DisplayElement { private float temperature; private float humidity; private float pressure; private Subject subject; public CurrentConditionDisplay(Subject subject) { // TODO Auto-generated constructor stub this.subject = subject; subject.registerObserver(this); } @Override public void display() { // TODO Auto-generated method stub System.out.println("Current Conditions:" + temperature + ":" + humidity +"" + pressure); } @Override public void update(float temperature, float humidity, float pressure) {//更新天气数据 // TODO Auto-generated method stub this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; display(); } }
WeatherData
public class WeatherData implements Subject { private float temperature; private float humidity; private float pressure; private ArrayList<Observer> observers; public WeatherData() { // TODO Auto-generated constructor stub observers = new ArrayList<Observer>(); } @Override public void registerObserver(Observer o) { // TODO Auto-generated method stub observers.add(o); } @Override public void removeObserver(Observer o) { // TODO Auto-generated method stub observers.remove(o); } @Override public void notifyObservers() { // TODO Auto-generated method stub for (Observer observer : observers) { observer.update(temperature, humidity, pressure); } } public void setMeasurements(float temperature,float humidity,float pressure){ this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; notifyObservers(); } }
四. 应用观察者模式的优点和缺点
1.优点:
该项目中,仅有一个具体观察者,实际上根据业务需求可能随时添加新的观察者(比如增加一块天气的预报数据显示牌),这时只需要把新增加的观察者接到observer接口上就可以(在被观察者处登记)。观察者和被观察者没有被紧密的耦合,因此当两者有新的成员加入或者旧的成员退出时,只需要登记和移除就可以。
2.缺点:
观察者模式要求观察者之间是相互独立的,否则存在依赖关系的话循环调用系统会崩溃。另外,如果被观察者有很多观察者的话,通知他们会很花时间。
以上是关于天气预报项目中的观察者模式分析的主要内容,如果未能解决你的问题,请参考以下文章