模式的秘密-觀察者模式(四)
阿新 • • 發佈:2018-04-26
註冊 ID java protected 發布 als ext color 目標
區別對待觀察者場景問題
兩點需求:
第一:黃明女朋友只想接收下雨的天氣預報。
第二:黃明老媽,想接收下雨或者下雪的天氣預報。
解決思路:
情況之一:
如果天氣晴天,按照黃明女朋友需要下雨添加,黃明老媽需要下雨或者下雪條件,他倆都不需要通知。
情況二:
如果下雨,則黃明女朋友和老媽都要通知。
情況三:
如果下雪,只通知黃明老媽。
代碼實例解決場景問題
實例的實現步驟:
1,定義目標的抽象類和觀察者的接口
2,實現目標的類和觀察者接口
3,進行測試。
第一步:創建目標的抽象類:
package com.WeatherObserverPattern02; import java.util.ArrayList;import java.util.List; public abstract class WeatherSubject { //保存註冊的觀察者對象 public List<Observer> observers=new ArrayList<Observer>(); //attach detach notifyObservers //把訂閱天氣的人添加到訂閱者列表 public void attach(Observer observer) { observers.add(observer); }//刪除集合中指定的訂閱天氣的人 public void detach(Observer observer) { observers.remove(observer); } protected abstract void notifyObservers(); }
第二步:創建目標類:在notifyObservers裏面,分場景調用update(通知觀察者)
package com.WeatherObserverPattern02; import com.WeatherObserverPattern02.WeatherSubject; publicclass ConcreteWeatherSubject extends WeatherSubject { //晴天,下雨,下雪 //目標對象狀態 private String weatherContent; public String getWeatherContent() { return weatherContent; } public void setWeatherContent(String weatherContent) { this.weatherContent = weatherContent; this.notifyObservers(); } @Override protected void notifyObservers() { for(Observer observer:observers) { //規則:黃明女朋友只需要下雨,老媽既要下雨也要下雪 //如果天氣晴天: //doNothing //如果下雨 if("下雪".equals(this.getWeatherContent())) { if("黃明的女朋友".equals(observer.getObserverName())) { observer.update(this); } if("黃明的老媽".equals(observer.getObserverName())) { observer.update(this); } } //如果下雪 if("下雪".equals(this.getWeatherContent())) { if("黃明的老媽".equals(observer.getObserverName())) { observer.update(this); } } } }; }
第三步:創建觀察者接口:
package com.WeatherObserverPattern02; //定義一個更新的接口給哪些在目標發生改變的時候被通知的觀察者對象調用 public interface Observer { //更新的接口 public void update(WeatherSubject subject); //設置觀察者名稱 public void setObserverName(String observerName); //獲取觀察者名稱 public String getObserverName(); }
第四步:創建具體觀察者類:
package com.WeatherObserverPattern02; 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); } @Override public void setObserverName(String observerName) { this.observerName=observerName; } @Override public String getObserverName() { return this.observerName; } public String getWeatherContent() { return weatherContent; } public void setWeatherContent(String weatherContent) { this.weatherContent = weatherContent; } public String getRemaindThing() { return remindThing; } public void setRemindThing(String remindThing) { this.remindThing = remindThing; } }
測試:
package com.WeatherObserverPattern02; import com.WeatherObserverPattern02.ConcreteObserver; import com.WeatherObserverPattern02.ConcreteWeatherSubject; //區別對待觀察者場景問題 public class Client { public static void main(String[] args) { //1,創建目標 ConcreteWeatherSubject weather=new ConcreteWeatherSubject(); //2,創建觀察者 ConcreteObserver observerGirl=new ConcreteObserver(); observerGirl.setObserverName("黃明的女朋友"); observerGirl.setRemindThing("下雨了,安靜呆在家裏吧"); ConcreteObserver observerMum=new ConcreteObserver(); observerMum.setObserverName("黃明的老媽"); observerMum.setRemindThing("不管下雨還是下雪都不出門"); //3,註冊觀察者 weather.attach(observerGirl); weather.attach(observerMum); //4,目標發布天氣 weather.setWeatherContent("下雨"); weather.setWeatherContent("下雪"); weather.setWeatherContent("晴天"); } }
測試結果:
黃明的女朋友收到了下雪,下雨了,安靜呆在家裏吧
黃明的老媽收到了下雪,不管下雨還是下雪都不出門
黃明的老媽收到了下雪,不管下雨還是下雪都不出門
模式的秘密-觀察者模式(四)