觀察者模式(訂閱釋出模式)及例項Demo
1、觀察者模式,又稱訂閱釋出模式,其架構如下:
2、例項demo——訂閱天氣,釋出天氣
1>WeatherSubject 目標類
public class WeatherSubject {
private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer){ observers }
public void detach(Observer observer){ observers.remove(observer); }
protected void notifyObservers(){ for(Observer observer : observers){ observer } }
} |
2> 具體的目標類
public class ConcreteWeatherSubject extends WeatherSubject {
private String weatherContent;
public String getWeatherContent() { return }
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