觀察者模式(Observer Patterns)java
觀察者模式:定義了對象間一對多的依賴,這樣一來,當一個對象的狀態改變時,它的全部依賴都會自動收到通知並自動更新。android
如今有一種需求:IOS系統的手機和Android的手機都去訂閱天氣預報。那麼提供天氣狀況的就是一個主題。而Iphone和Android就是觀察者,來觀察天氣預報的變化。當天氣發生變化的時候在他們兩者都可以數據同步。
1.建立觀察者(Observer)接口iphone
public interface Observer { public void update(int low, int high, String weather); }
2.建立主題(Subject)接口測試
public interface Subject { public void addObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObserver(); }
3.添加Weather對象實現Subject接口this
public class WeatherData implements Subject{ private int low ; private int high; private String weather; private List<Observer> list = new ArrayList<Observer>();//list集合中放的都是Observer的實現類 //get方法 public int getLow() { return low; } public int getHigh() { return high; } public String getWeather() { return weather; } //設置low high weather public void setData(int low ,int high,String weather){ this.low = low ; this.high = high; this.weather = weather; notifyObserver(); } //添加觀察者 public void addObserver(Observer observer) { if(!list.contains(observer)){ list.add(observer); } } //刪除觀察者 public void removeObserver(Observer observer) { if(list.contains(observer)){ list.remove(observer); } } //通知 public void notifyObserver() { for(Observer o : list){ o.update(getLow(),getHigh(),getWeather()); } } }
4.分別建立Iphone和Android類實現Observer接口spa
public class Iphone implements Observer{ public void display(int low ,int high ,String weather){ System.out.println("Iphone:"+low + high + weather); } public void update(int low, int high, String weather) { display(low, high, weather); } }
public class Android implements Observer{ public void display(int low ,int high ,String weather){ System.out.println("Android:"+low + high + weather); } public void update(int low, int high, String weather) { display(low, high, weather); } }
5.測試code
public class test { public static void main(String[] args) { WeatherData wd = new WeatherData(); Android android = new Android(); Iphone iphone = new Iphone(); wd.addObserver(android);//把android添加進去 wd.addObserver(iphone );//把iphone 添加進去 wd.setData(11, 33,"晴天"); //當改變主題時,android, iphone 都會收到通知 wd.setData(13, 23, "陰天"); } }