观察者模式概述2014-06-09一、什么是观察者模式?观察者模式(Observer)是类的行为模式。观察者模式定义了一种一对多的依 赖关系,让多个观察者同时观察某一个观察主题,当这一个观察主题发生改变的 时候,会通知所有的观察者,让所有的观察者都能得到及时响应。二、观察者模式的结构观察者的简略结构如下图:

从上面的简略结构中,我们可以看到主要存在四个角色,分别是抽象观察主题 、具体观察主题、抽象观察者和具体观察者。l 抽象观察主题:抽象主题又叫做被观察者角色(Observable)。用一个接口 表示,把所有观察者对象都存进一个集合里,并且提供可以增加和删除观察者的 方法。l 具体观察主题:实现观察主题的所有方法,通过具体观察主题来增加或删除 观察者,但具体观察主题发生变化时,通知已经登记的观察者。l 抽象观察者:抽象观察者可以是一个接口或者是一个抽象类。它有一个具体 抽象观察者的方法。当观察主题发生变化时,通过此方法来通知观察者。这个方 法称为“更新方法”。l 具体观察者:具体观察者主要实现抽象观察者提供的更新方法,并以此做出 其他业务逻辑操作,它通常是一个具体子类。三、示例下面通过一个简单的例子来说明观察者模式的使用。假如现在有一个天气预报系统,当天气变化时,要通知所有的人,注意天气变 化。使用观察者模式设计如下:首先要有一个抽象观察主题(抽象被观察者),即天气的抽象类Weather.java ,它提供三个方法,即增加观察者,移除观察者,通知观察者,代码如下:
public interface Weather {public void addWatcher(People people);public void removeWatcher(People people);public void notifyPeople();}
具体观察者WeatherImpl.java:
public class WeatherImpl implements Weather {private List<People> peoples = new ArrayList<People>();@Overridepublic void addWatcher(People watcher) {peoples.add(watcher);}@Overridepublic void removeWatcher(People watcher) {peoples.remove(watcher);}@Overridepublic void notifyPeople() {for (People p : peoples) {p.care();}}}