一: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:應用系統(tǒng)中,訂閱信息:
???????? 如有多個用戶訂閱的跟蹤某記錄更新信息。