观察者模式

观察者设计模式UML类图

观察者UML类图

观察者设计模式java实现

/**
* WeatherType enumeration.
*/
public enum WeatherType {

SUNNY, RAINY, WINDY, COLD;

@Override
public String toString() {
return this.name().toLowerCase();
}
}

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

void update(WeatherType currentWeather);

}

/**
* Orcs.兽人
*/
public class Orcs implements WeatherObserver {

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

@Override
public void update(WeatherType currentWeather) {
switch (currentWeather) {
case COLD:
//兽人是冰冷的。
LOGGER.info("The orcs are freezing cold.");
break;
case RAINY:
//兽人湿淋淋的。
LOGGER.info("The orcs are dripping wet.");
break;
case SUNNY:
//太阳伤害了兽人的眼睛。
LOGGER.info("The sun hurts the orcs' eyes.");
break;
case WINDY:
//兽人的气味在风中几乎消失了。
LOGGER.info("The orc smell almost vanishes in the wind.");
break;
default:
break;
}
}
}

/**
* Hobbits.霍比特人
*/
public class Hobbits implements WeatherObserver {

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

@Override
public void update(WeatherType currentWeather) {
switch (currentWeather) {
case COLD:
//霍比特人在寒冷的天气中发抖。
LOGGER.info("The hobbits are shivering in the cold weather.");
break;
case RAINY:
//霍比特人从雨中寻找掩饰。
LOGGER.info("The hobbits look for cover from the rain.");
break;
case SUNNY:
//快乐的霍比特人在温暖的阳光下歌唱。
LOGGER.info("The happy hobbits bade in the warm sun.");
break;
case WINDY:
//霍比特人在大风天紧紧地戴上帽子。
LOGGER.info("The hobbits hold their hats tightly in the windy weather.");
break;
default:
break;
}
}
}

/**
* 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);
}
}
}

/**
* The Observer pattern is a software design pattern in which an object, called the subject,
* maintains a list of its dependents, called observers, and notifies them automatically of any
* state changes, usually by calling one of their methods. It is mainly used to implement
* distributed event handling systems. The Observer pattern is also a key part in the familiar
* model–view–controller (MVC) architectural pattern. The Observer pattern is implemented in
* numerous programming libraries and systems, including almost all GUI toolkits.
*
* <p>In this example {@link Weather} has a state that can be observed. The {@link Orcs} and {@link
* Hobbits} register as observers and receive notifications when the {@link Weather} changes.
观察者模式是一种软件设计模式,在该模式中,称为主题的对象会维护其依赖项的列表(称为观察者),并通常通过调用其方法之一来自动通知状态更改。 它主要用于实现分布式事件处理系统。 观察者模式也是熟悉的模型-视图-控制器(MVC)体系结构模式中的关键部分。 Observer模式在众多编程库和系统中实现,包括几乎所有的GUI工具包。
<p>在此示例中,{@ link Weather}的状态可以观察到。 {@link Orcs}和{@link Hobbits}注册为观察者,并在{@link Weather}更改时接收通知。
*/
public class App {

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

/**
* Program entry point.
*
* @param args command line args
*/
public static void main(String[] args) {

Weather weather = new Weather();
weather.addObserver(new Orcs());
weather.addObserver(new Hobbits());

weather.timePasses();
weather.timePasses();
weather.timePasses();
weather.timePasses();

// Generic observer inspired by Java Generics and Collection by Naftalin & Wadler
LOGGER.info("--Running generic version--");
GWeather genericWeather = new GWeather();
genericWeather.addObserver(new GOrcs());
genericWeather.addObserver(new GHobbits());

genericWeather.timePasses();
genericWeather.timePasses();
genericWeather.timePasses();
genericWeather.timePasses();
}
}

极客时间

实际应用案例

  • EventBus Guava 事件总线