1. 程式人生 > >觀察者模式(訂閱釋出模式)及例項Demo

觀察者模式(訂閱釋出模式)及例項Demo

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

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