有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事。对象甚至在运行时可决定是否要继续被通知。有了观察者,你将会消息灵通。
在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
为了方便理解观察者模式,我们以报社为例:
如果你了解报社的订阅是怎么回事,其实就知道观察者是怎么回事了,只是名称不太一样:
出版者改称为“主题”(subject)或“被观察者”(observable),订阅者改称为“观察者”(observer).
主题 + 观察者 = 观察者模式
主题就是定义中的“一”,观察者为定义中的“多”,当主题有变化时,便会通知它的”订阅者“也就是”观察者“
举例:有一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息。
public interface subject { //观察者订阅服务 public void registerobserver(observer o); //观察者取消订阅服务 public void removeobserver(observer o); //主题改变时,会被调用,通知所有观察者 public void notifyobservers(); }
public interface observer { public void update(float temp, float humidity, float pressure); }
public class weatherdata implements subject { private arraylist<observer> observers; private float temperature; private float humidity; private float pressure; public weatherdata() { observers = new arraylist<observer>(); } public void registerobserver(observer o) { observers.add(o); } public void removeobserver(observer o) { int i = observers.indexof(o); if (i >= 0) { observers.remove(i); } } public void notifyobservers() { for (observer observer : observers) { observer.update(temperature, humidity, pressure); } } public void measurementschanged() { notifyobservers(); } public void setmeasurements(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementschanged(); } // public float gettemperature() { // return temperature; // } // // public float gethumidity() { // return humidity; // } // // public float getpressure() { // return pressure; // } }
public class currentconditionsdisplay implements observer { private float temperature; private float humidity; private subject weatherdata; public currentconditionsdisplay(subject weatherdata) { this.weatherdata = weatherdata; //订阅 weatherdata.registerobserver(this); } public void update(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; display(); } public void display() { system.out.println("current conditions: " + temperature + "f degrees and " + humidity + "% humidity"); } }
public class weatherstation { public static void main(string[] args) { //创建主题 weatherdata weatherdata = new weatherdata(); //创建观察者并订阅 currentconditionsdisplay currentdisplay = new currentconditionsdisplay(weatherdata); // statisticsdisplay statisticsdisplay = new statisticsdisplay(weatherdata); // forecastdisplay forecastdisplay = new forecastdisplay(weatherdata); //通知观察者 weatherdata.setmeasurements(80, 65, 30.4f); // weatherdata.setmeasurements(82, 70, 29.2f); // weatherdata.setmeasurements(78, 90, 29.2f); } }
设计模式源于生活
如对本文有疑问, 点击进行留言回复!!
荐 厉害了!阿里P8架构师用4大技术文档带你深入解读爆火的中台战略
FlowableException: Error initialising dmn data model报错问题
网友评论