目标对象(Subject)
观察者对象(Observer)
将观察者对象注册到目标对象上,当目标对象的状态发生改变时推送给观察者(推/拉模型)
以天气预报为例:
/**目标对象*/
public class WeatherSubject { private String weatherContent; private List<WeatherObserver> list = new ArrayList<WeatherObserver>(); public void addObserver(WeatherObserver observer) { this.list.add(observer); } public void setWeatherContent(String weatherContent) { this.weatherContent = weatherContent; for(WeatherObserver observer : list) { // observer.update(this); 拉模型
// observer.update(weatherContent);推模型 } } public String getWeatherContent() { return weatherContent; } }
/**观察者对象*/
public class WeatherObserver { private String observerName; public WeatherObserver(String observerName) { this.observerName = observerName; } public void update(WeatherSubject subject) { System.out.println(this.observerName +"收到的天气是:"+subject.getWeatherContent()); } }
public class Main { public static void main(String[] args) { WeatherObserver girl = new WeatherObserver("女朋友"); WeatherObserver monther = new WeatherObserver("monther"); WeatherSubject subject= new WeatherSubject(); subject.addObserver(girl); subject.addObserver(monther); subject.setWeatherContent("小雨"); } }
用jdk中提供的工具实现
/** * 目标对象 ,将观察者注册到目标对象上,当目标对象的状态发生变化时,通知到每个观察者 */ public class WeatherSubject extends Observable { private String weatherContent;//需要通知的内容 public String getWeatherContent() { return weatherContent; } public void setWeatherContent(String weatherContent) { this.weatherContent = weatherContent; //设置变更内容时 setChanged(); //推模型 notifyObservers(weatherContent); //拉模型 //notifyObservers(); } }
//观察者 public class WeatherObserver implements Observer { private String observerName; public WeatherObserver(String observerName) { this.observerName = observerName; } //目标对象通知过来的更新 @Override public void update(Observable o, Object arg) { System.out.println(observerName+":收到的天气预报是:"+arg); } }
public class Client { public static void main(String[] args) { Observer monther = new WeatherObserver("老妈"); Observer girlFriend = new WeatherObserver("女朋友"); WeatherSubject observable = new WeatherSubject();//目标对象 即可以被观察的对象 observable.addObserver(monther); observable.addObserver(girlFriend); observable.setWeatherContent("下雨天"); } }
浙公网安备 33010602011771号