天气预报项目中的观察者模式分析

一.观察者模式简介

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

 

二.观察者模式适用场合

  1. 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,需要将这两个方面分别封装到独立的对象中,彼此独立地改变和复用的时候。
  2. 当一个系统中一个对象的改变需要同时改变其他对象内容,但是又不知道待改变的对象到底有多少个的时候。
  3. 当一个对象的改变必须通知其他对象做出相应的变化,但是不能确定通知的对象是谁的时候。

 

三.天气预报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.缺点:

  观察者模式要求观察者之间是相互独立的,否则存在依赖关系的话循环调用系统会崩溃。另外,如果被观察者有很多观察者的话,通知他们会很花时间。

posted on 2018-10-26 22:06  漏断人初静0201  阅读(221)  评论(0编辑  收藏  举报

导航