1、觀察者模式,又稱訂閱釋出模式,其架構如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LclHbXJGaSNDW1I0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jNxQjM1kzMyIzMygDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
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