Mark's Java Blog
          MyEclipse, Java EE, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript,SOA
          使用java.util.Observable類和java.util.Observer接口實(shí)現(xiàn)觀察者模式氣象站(拉、推均實(shí)現(xiàn),自己也可以按照它的實(shí)現(xiàn)方法擴(kuò)展)

          拉:也就是觀察者來決定接到“可觀察者”類通知時(shí)獲取“可觀察者”的哪些變化。調(diào)用方法notifyObservers();

          推:“可觀察者”類通知觀察者時(shí)傳遞給觀察者自身所有的變化。調(diào)用方法notifyObservers(Object arg);


          import java.util.Observable;
          import java.util.Observer;
           //此類實(shí)現(xiàn)的是“拉”的發(fā)式,繼承java.util.Observable類
          public class WeatherData extends Observable {
           private float temperature;
           private float humidity;
           private float pressure;
           //構(gòu)造器不需要為了記住觀察者們而建立數(shù)據(jù)結(jié)構(gòu)了
           public WeatherData() { }
           
           public void measurementsChanged() {
            setChanged();//指示可觀察者狀態(tài)已改變(可以由狀態(tài)是否改變決定是否通知觀察者,很容易,自己實(shí)現(xiàn)就行)
            notifyObservers();//沒有調(diào)用傳送數(shù)據(jù)對(duì)象,表示采用“拉”的做法
           }
           
           public void setMeasurements(float temperature, float humidity, float pressure) {
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            measurementsChanged();
           }
           //以下不是新方法,而是為了使用“拉”的做法
           public float getTemperature() {
            return temperature;
           }
           
           public float getHumidity() {
            return humidity;
           }
           
           public float getPressure() {
            return pressure;
           }
          }


          import java.util.Observable;
          import java.util.Observer;
           //實(shí)現(xiàn)java.util.Observer接口,成為觀察者
          public class CurrentConditionsDisplay implements Observer, DisplayElement {
           Observable observable;
           private float temperature;
           private float humidity;
           //構(gòu)造器需要Observable 作為參數(shù),并將本對(duì)象登記為觀察者
           public CurrentConditionsDisplay(Observable observable) {
            this.observable = observable;
            observable.addObserver(this);
           }
           //改變update()方法,增加Observable 和數(shù)據(jù)對(duì)象為參數(shù)
           public void update(Observable obs, Object arg) {
            if (obs instanceof WeatherData) {
             WeatherData weatherData = (WeatherData)obs;
             this.temperature = weatherData.getTemperature();
             this.humidity = weatherData.getHumidity();
             display();
            }
           }
           
           public void display() {
            System.out.println("Current conditions: " + temperature
             + "F degrees and " + humidity + "% humidity");
           }
          }

          注意:java.util.Observable是一個(gè)類而不是接口,而且還沒有實(shí)現(xiàn)任何接口。它本身的實(shí)現(xiàn)有很多問題,限制了它的使用和復(fù)用。由于它是個(gè)類,所以我們只能繼承,java不允許多繼承,所以限制了其復(fù)用潛力。而且setChanged()方法被保護(hù)起來(被定義成protected),這就意味著除非繼承,否則無法創(chuàng)建實(shí)例并組合到自己的對(duì)象中,這就違背了設(shè)計(jì)原則“多用組合,少用繼承”。
          posted on 2008-03-18 15:04 Mark 閱讀(259) 評(píng)論(0)  編輯  收藏 所屬分類: 設(shè)計(jì)模式
           
          主站蜘蛛池模板: 墨脱县| 南溪县| 郴州市| 龙岩市| 平南县| 万宁市| 神农架林区| 普宁市| 丹凤县| 淳安县| 开化县| 祁东县| 崇左市| 保靖县| 万盛区| 邢台市| 无极县| 乐都县| 金川县| 玉环县| 山丹县| 屯昌县| 通道| 巫山县| 农安县| 德钦县| 讷河市| 阿合奇县| 滕州市| 罗江县| 安新县| 江西省| 德兴市| 武鸣县| 察隅县| 永仁县| 晋中市| 翁牛特旗| 景德镇市| 连江县| 遂川县|