基于天气预报的观察者模式分析

Posted on 2018-10-24 12:42  loooooops  阅读(356)  评论(0)    收藏  举报

一、观察者模式

        观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

        观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

 
二、分析
观察者为天气状态观察者:

package com.iluwatar.observer;

/**
*
* Observer interface.
*
*/
public interface WeatherObserver {

void update(WeatherType currentWeather);

}

被观察者为天气条件:

/**
*
* Weather can be observed by implementing {@link WeatherObserver} interface and registering as
* listener.
*
*/
public class Weather {

private static final Logger LOGGER = LoggerFactory.getLogger(Weather.class);

private WeatherType currentWeather;
private List<WeatherObserver> observers;

public Weather() {
observers = new ArrayList<>();
currentWeather = WeatherType.SUNNY;
}

public void addObserver(WeatherObserver obs) {
observers.add(obs);
}

public void removeObserver(WeatherObserver obs) {
observers.remove(obs);
}

/**
* Makes time pass for weather
*/
public void timePasses() {
WeatherType[] enumValues = WeatherType.values();
currentWeather = enumValues[(currentWeather.ordinal() + 1) % enumValues.length];
LOGGER.info("The weather changed to {}.", currentWeather);
notifyObservers();
}

private void notifyObservers() {
for (WeatherObserver obs : observers) {
obs.update(currentWeather);
}
}
}

   被观察者使用Subject接口完成对观察者的注册、移除、和发送通知,观察者使用Observer和DisplayElement接口完成对自身数据的更新和显示。

三、原理

地址:https://github.com/BaronZ88/DesignPatterns/tree/master/src/com/baron/patterns/observer

 

四、优缺点

优点:

1、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。

由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。

2、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,

缺点:

1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

2、如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。

 
  
 

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3