設計模式-觀察者模式(下)<轉>

來源:互聯網
上載者:User

標籤:

觀察者模式在Java中有兩種實現方式,上文是一種方式,這種方式是自己寫代碼實現。另一種方式是使用Java內建的觀察者模式來實現。 相關的介面和類如下:java.util.Observable   主題(可觀察者)------class
java.util.Observer       觀察者                     -------interface  相關的API如下: 1、java.util.ObservableObservable() 
          構造一個帶有零個觀察者的 Observable。 
方法摘要 
void addObserver(Observer o) 
          如果觀察者與集合中已有的觀察者不同,則向對象的觀察者集合中添加此觀察者。 
protected  void clearChanged() 
          指示對象不再改變,或者它已對其所有的觀察者通知了最近的改變,所以 hasChanged 方法將返回 false。 
 int countObservers() 
          返回 Observable 對象的觀察者數目。 
 void deleteObserver(Observer o) 
          從對象的觀察者集合中刪除某個觀察者。 
 void deleteObservers() 
          清除觀察者列表,使此對象不再有任何觀察者。 
 boolean hasChanged() 
          測試對象是否改變。 
 void notifyObservers() 
          如果 hasChanged 方法指示對象已改變,則通知其所有觀察者,並調用 clearChanged 方法來指示此對象不再改變。 
 void notifyObservers(Object arg) 
          如果 hasChanged 方法指示對象已改變,則通知其所有觀察者,並調用 clearChanged 方法來指示此對象不再改變。 
protected  void setChanged() 
          標記此 Observable 對象為已改變的對象;現在 hasChanged 方法將返回 true。  2、java.util.Observer
void update(Observable o, Object arg) 
          只要改變了 observable 對象就調用此方法。 觀察API可以發現, java.util.Observable已經對觀察者進行管理了,不再需要主題追蹤每個觀察者了。 下面通過Java的內建的觀察者模式來重寫上個天氣應用,部分類代碼如下:import java.util.Observable; 

public class WeatherData extends Observable { 
        private float temperature; 
        private float humidity; 
        private float pressure; 

        public WeatherData() { 
        } 

        /** 
         * 測量值改變了 
         */ 
        public void measurementsChanged() { 
                setChanged();             //設定改變了 
                notifyObservers();    //通知所有的觀察者 
        } 

        /** 
         * 重新設定了測量值 
         */ 
        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; 
        } 
} public interface DisplayElement { 
        public void display(); 
} import java.util.Observable; 
import java.util.Observer; 

public class CurrentConditionsDisplay implements Observer, DisplayElement { 
        Observable observable; 
        private float temperature; 
        private float humidity; 

        public CurrentConditionsDisplay(Observable observable) { 
                this.observable = observable; 
                observable.addObserver(this); 
        } 

        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不是介面,是類,如果一個類想具有另一個超類的功能,同時還想擁有 Observable行為,就陷入兩難地步。 實際上,Java內部使用觀察者模式也很多,GUI的事件就是典型的觀察者模式。 

本文出自 “熔 岩” 部落格,請務必保留此出處http://lavasoft.blog.51cto.com/62575/201633

設計模式-觀察者模式(下)<轉>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.