天天看點

觀察者模式(訂閱釋出模式)及執行個體Demo

1、觀察者模式,又稱訂閱釋出模式,其架構如下:

觀察者模式(訂閱釋出模式)及執行個體Demo

2、執行個體demo——訂閱天氣,釋出天氣

1>WeatherSubject  目标類

public class WeatherSubject {

   private List<Observer> observers = new ArrayList<Observer>();

   public void attach(Observer observer){

     observers.add(observer);

   }

   public void detach(Observer observer){

     observers.remove(observer);

   }

   protected void notifyObservers(){

     for(Observer observer : observers){

        observer.update(this);

     }

   }

}

2> 具體的目标類

public class ConcreteWeatherSubject extends WeatherSubject {

   private String weatherContent;

   public String getWeatherContent() {

     return weatherContent;

   }

   public void setWeatherContent(String weatherContent) {

     this.weatherContent = weatherContent;

     this.notifyObservers();

   }

}

3> 觀察者

public interface Observer {

   public void update(WeatherSubject subject);

}

4> 具體的觀察者

public class ConcreteObserver implements Observer {

   private String observerName;

   private String weatherContent;

   private String remindThing;

   @Override

   public void update(WeatherSubject subject) {

     weatherContent = ((ConcreteWeatherSubject)subject).getWeatherContent();

     System.out.println(observerName + "收到了" + weatherContent + " ," + remindThing);

   }

   public String getObserverName() {

     return observerName;

   }

   public void setObserverName(String observerName) {

     this.observerName = observerName;

   }

   public String getWeatherContent() {

     return weatherContent;

   }

   public void setWeatherContent(String weatherContent) {

     this.weatherContent = weatherContent;

   }

   public String getRemindThing() {

     return remindThing;

   }

   public void setRemindThing(String remindThing) {

     this.remindThing = remindThing;

   }

}

5> test 類

public class test {

   public static void main(String[] args) {

     //1.建立目标

     ConcreteWeatherSubject weather = new ConcreteWeatherSubject();

     //2.建立觀察者

     ConcreteObserver observerGirl = new ConcreteObserver();

     observerGirl.setObserverName("girl");

     observerGirl.setRemindThing("go shopping");

     ConcreteObserver observerBoy = new ConcreteObserver();

     observerBoy.setObserverName("boy");

     observerBoy.setRemindThing("play football");

     //3.注冊觀察者

     weather.attach(observerGirl);

     weather.attach(observerBoy);

     //4.目标釋出天氣

     weather.setWeatherContent("a nice day!");

   }

}

測試結果:

girl收到了a nice day! ,go shopping

boy收到了a nice day! ,play football

繼續閱讀