一:case context:
有一个气象信息类WeatherData,属性包括temperature,humidity等,现有两种显示WeatherData数据的类WeatherDataDisplay1和WeatherDataDisplay2,当WeatherData的信息改变时,这两个显示的类中的数据也改变,维护性方面,可能会有第三种显示方法,某个显示类可以申请不根据WeatherData数据实时改变。
二:
目前现方法, WeatherData中
public void measurementsChanged()
{
display1.update(getTemperature(),getHumidity());
display2.update(getTemperature(),getHumidity());
}
但方法体中的代码是可能会变的,有display3的时候,必须得修改代码。
三:
The Observer pattern:defines a one-to-many dependency between objects so that when one object changes state,
all of its dependents are notified and updated automatically.
此模式类包括: Subject 接口{registerObserver();removeObserver(),notifyObservers()}, Concrete Subject 类
Observer接口{update();}, 多个ConcreteObserver类(display1,display2)。
public class WeatherData implements Subject
{
private List observerList;
private float temperature;
private float humidity;
public void registerObserver(Observer observer)
{
observerList.add(observer);
}
public void notifyObjects()
{
for (Iterator iter=objectList.iterator();iter.hasNext();)
{
Observer observer=(Observer)iter.next();
observer.update();
}
}
public void changeData(float newTemperature)
{
this.temperature=newTemperature;
notifyObjects();
}
}
//
public class WeatherReport1 implements Observer{
private WeatherData weatherData;
public WeatherReport1(WeatherData weatherData)
{
this.weatherData=weatherData;
weatherData.registerObject(this);
}
public void update()
{
System.out.println("report1--now temperature is:"+weatherData.getTemperature());
}
}
//客户端测试代码
public class Tester {
public static void main(String[] args) {
WeatherData weatherData=new WeatherData();
WeatherReport1 weatherReport1=new WeatherReport1(weatherData);
WeatherReport2 weatherReport2=new WeatherReport2(weatherData);
weatherData.changeData(10);
weatherData.removeObject(weatherReport1);
weatherData.changeData(20);
}
}
四:java语言build-in支持
在java.util.包中
Subject接口-->Observable 类(把Observer注册,notify等方法实现)
Observer接口-->Observer接口
缺点:Observable是一个类你必须继承它,如果还要继承其它类就不行了。
所以如果java内建的类不适合你,就按我们上面写的自己重头写一个。
五:实例
1: swing中的事件处理:
button.addActionListener(new AL1);
button.addActionListerner(new AL2);
public void AL1 implements ActionListener{
public void actionPerformed(Event e)
{//---
}
}
2:应用系统中,订阅信息:
如有多个用户订阅的跟踪某记录更新信息。