java设计模式--观察者模式

xiaoxiao2021-02-28  131

观察者模式:概念自行百度; 使用步骤(java提供接口): 被观察者(目标:一方):继承Observable类,在目标提醒变量的set方法中调用notifyObservers方法:此方法可以调 用两个中任意一个,并且与观察者update方法参数对应,①notifyObservers(object arg)推模式直接把需要的内容 推送过去②notifyObservers()拉模式,默认把自己整个对象推送过去,观察者根据需要自己通过对象(目标对象) 获取. 注意:在调用notifyObservers方法之前,必须先调用this.setChanged()方法,此方法通知观察者目标(目标本身)发 生了变化,还有notifyObservers方法对应观察者类的update(Observable o, Object arg)方法; 被观察者(目标)代码: public class ConcreteWeatherSubject extends Observable{ private String weathercontent; public String getWeathercontent() { return weathercontent; } public void setWeathercontent(String weathercontent) { this.weathercontent = weathercontent; this.setChanged();//此方法必须调用 // this.notifyObservers(); this.notifyObservers(weathercontent); } } 观察者(多方):实现Observer接口,重写update(Observable o, Object arg)方法(第一个参数为目标调用用 notifyObservers(object arg)时对应的目标本身对象为拉模式,第二个参数为目标调用notifyObservers()时目标 主动推送的内容为推模式) 观察者代码: public class ConcreteObserver implements Observer{ private String observername; public String getObservername() { return observername; } public void setObservername(String observername) { this.observername = observername; } @Override public void update(Observable o, Object arg) { System.out.println(observername+"收到了:"+arg); // System.out.println(observername+"收到了:"+((ConcreteWeatherSubject) o).getWeathercontent()); } } 测试类:注意观察者需要注册,需要被观察者调用addObserver()方法 public class Test { public static void main(String[] args) { ConcreteWeatherSubject subject = new ConcreteWeatherSubject(); ConcreteObserver observer1 = new ConcreteObserver(); observer1.setObservername("张三"); ConcreteObserver observer2 = new ConcreteObserver(); observer2.setObservername("李四"); subject.addObserver(observer1);//注册观察者对象 subject.addObserver(observer2);//注册观察者对象 subject.setWeathercontent("天气预报:天气晴朗,艳阳高照!!"); } } 推模式:目标主动把观察者需要的数据推送给它; 拉模式:目标把自己本身对象推送给观察者,由观察者自己取所需数据 第一次写文章,纯属个人理解,还请多多指教!!


转载请注明原文地址: https://www.6miu.com/read-40093.html

最新回复(0)