模式的秘密-观察者模式(四)
区别对待观察者场景问题
两点需求:
第一:黄明女朋友只想接收下雨的天气预报。
第二:黄明老妈,想接收下雨或者下雪的天气预报。
解决思路:
情况之一:
如果天气晴天,按照黄明女朋友需要下雨添加,黄明老妈需要下雨或者下雪条件,他俩都不需要通知。
情况二:
如果下雨,则黄明女朋友和老妈都要通知。
情况三:
如果下雪,只通知黄明老妈。
代码实例解决场景问题
实例的实现步骤:
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; public class 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("晴天"); } }
测试结果:
黄明的女朋友收到了下雪,下雨了,安静呆在家里吧
黄明的老妈收到了下雪,不管下雨还是下雪都不出门
黄明的老妈收到了下雪,不管下雨还是下雪都不出门