Java内置Observer的模式学习

简而言之,观察者模式即为主题--订阅者关系。

主要实现主题类,订阅者即可。如下为用观察者模式实现的天气数据和显示板的示例。
  1. package ObserverPattern;
  2. import java.util.Observable;
  3. import java.util.Observer;
  4. /**
  5.  * Observer pattern
  6.  * @author Zheng Haitao
  7.  */
  8. public class WeatherData extends Observable {
  9.     private String status,pressure,humidity;
  10.     public WeatherData(){
  11.         
  12.     }
  13.     public void onMessureChanged(){
  14.         //no parameters,so adopt "pull" way  to fetch data.
  15.         this.notifyObservers();
  16.     }
  17.     public void setMessurementData(String status,String pressure,String humidity){
  18.         this.humidity = humidity;
  19.         this.pressure = pressure;
  20.         this.status   = status;
  21.         setChanged();
  22.         onMessureChanged();
  23.     }
  24.     public String getStatus(){
  25.         return status;
  26.     }
  27.     public String getPressure(){
  28.         return pressure;
  29.     }
  30.     public String getHumidity(){
  31.         return humidity;
  32.     }
  33.     public static void main(String[] args){
  34.         WeatherData subject = new WeatherData();
  35.         
  36.         bashboard1 b1 = new bashboard1(subject);
  37.         bashboard2 b2 = new bashboard2(subject);
  38.         bashboard3 b3 = new bashboard3(subject);
  39.         
  40.         subject.setMessurementData("sunny""98""3.00");
  41.     }
  42. }
  43. class bashboard1 implements Observer,IDisplay{
  44.     private Observable subject;
  45.     private String pressure;
  46.     public bashboard1(Observable observable){
  47.         this.subject = observable;
  48.         observable.addObserver(this);
  49.     }
  50.     @Override
  51.     public void update(Observable o, Object arg) {
  52.         if (o instanceof WeatherData){
  53.             display();
  54.         }
  55.     }
  56.     public void display(){
  57.         System.out.println("update bashboard1 status: " + pressure);
  58.     }
  59. }
  60. class bashboard2 implements Observer,IDisplay {
  61.     private Observable subject;
  62.     private String status;
  63.     public bashboard2(Observable observable){
  64.         this.subject = observable;
  65.         observable.addObserver(this);
  66.     }
  67.     @Override
  68.     public void update(Observable o, Object arg) {
  69.         if (o instanceof WeatherData){
  70.             WeatherData weatherData = (WeatherData)o;
  71.             status = weatherData.getStatus();
  72.             display();
  73.         }
  74.     }
  75.     public void display(){
  76.         System.out.println("update bashboard2 status: " + status);
  77.     }
  78. }
  79. class bashboard3 implements Observer,IDisplay {
  80.     private Observable subject;
  81.     private String status;
  82.     private String pressure;
  83.     private String humidity;
  84.     public bashboard3(Observable observable){
  85.         this.subject = observable;
  86.         observable.addObserver(this);
  87.     }
  88.     
  89.     @Override
  90.     public void update(Observable o, Object arg) {
  91.         if (o instanceof WeatherData){
  92.             WeatherData weatherData = (WeatherData)o;
  93.             status = weatherData.getStatus();
  94.             pressure = weatherData.getPressure();
  95.             humidity = weatherData.getHumidity();
  96.             display();
  97.         }
  98.     }
  99.     
  100.     public void display(){
  101.         System.out.println("update bashboard3:" + status +","+ pressure + ","+humidity);
  102.     }
  103. }
  104. interface IDisplay {
  105.     void display();
  106. }

你可能感兴趣的:(java,String)