设计模式 - 观察者模式
Posted mr-wenyan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 - 观察者模式相关的知识,希望对你有一定的参考价值。
观察者模式定义:
一个目标对象管理所有相依于它的观察者对象,并且在它本身状态发生改变时主动发出通知
气象检测实例:
如图,气象站是获取实际气象数据的物理设备,WeatherData对象是用来追踪气象站的数据,并更新布告板。
扩充WeatherData对象,使得布告板能够及时更新,并利于以后的扩展。
coding:
package Observer; public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObserver(); }
suject作为观察目标的抽象类,其中包括注册观察者的抽象方法、移除已注册的观察者方法、通知观察者的方法。
所有的观察目标继承此抽象类。
package Observer; import java.util.ArrayList; public class WeatherData implements Subject{ private ArrayList observers; private float temperature; private float humidity; private float pressure; public WeatherData() { observers = new ArrayList(); } 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 notifyObserver() { for (int i =0; i< observers.size(); i++) { Observer observer = (Observer)observers.get(i); observer.update(temperature, humidity, pressure); } } public void measurementsChanged() { notifyObserver(); } public void setMeasurements(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } }
具体观察目标,继承自抽象观察目标(subject),观察者可调用其中的registerObserver方法动态注册成为此观察目标的其中一个观察者。
notifyObserver遍历通知所有观察者。
package Observer; public interface Observer { public void update(float temp, float humidity, float pressure); }
观察者抽象类,所有观察者可继承此类。
package Observer; public class CurrentConditionsDisplay implements Observer { private float temperature; private float humidity; private float pressure; private Subject weatherDay; public CurrentConditionsDisplay(Subject subject) { this.weatherDay = subject; weatherDay.registerObserver(this); } public void update(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; display(); } public void display() { System.out.println("temp = " + temperature + " humi = " + humidity + " press = " + pressure); } }
具体观察者,在构造方法中,动态将自己注册成某一个观察目标的其中一个观察者。观察目标调用此类中的update方法动态通知数据的变化。
package com.company; import Observer.CurrentConditionsDisplay; import Observer.WeatherData; public class Main { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData); weatherData.setMeasurements(1, 3, 4); } }
run一下!
「观察者」调用「 观察目标」的注册方法,将自己注册成「观察目标」的其中一个「观察者」
「观察目标」在数据变化后,调用「观察者」的更新方法,更新「观察者」的数据
以上是关于设计模式 - 观察者模式的主要内容,如果未能解决你的问题,请参考以下文章
Java设计模式补充:回调模式事件监听器模式观察者模式(转)