Welcome 微信登录
编程资源 图片资源库

首页 / 软件开发 / 数据结构与算法 / 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解2016-03-29 csdn博客 SpikeKing观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新.

使用方法:

1. 首先新建主题(subject)接口, 负责注册(register)删除(remove)通知(notify)观察者; 观察者(observer)接口, 负责更新(update)数据;

主题(subject)接口: 注册观察者(registerObserver), 删除观察者(removeObserver), 通知观察者(notifyObservers, 通知所有观察者);

观察者(observer)接口: 更新(update);

代码:

/*** @time 2014年5月22日*/package observer;/*** @author C.L.Wang**/public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObervers();}/*** @time 2014年5月22日*/package observer;/*** @author C.L.Wang**/public interface Observer {public void update(float temp, float humidity, float pressure);}/*** @time 2014年5月22日*/package observer;/*** @author C.L.Wang**/public interface DisplayElement {public void display();}
2. 实现主题(subject)接口, 通过列表(list)的形式注册(register)和删除(remove)观察者,

通知(notify)观察者时, 循环调用所有已注册的观察者的更新(update)动作;

通过接口函数(set), 封装通知(notify)动作, 传入参数并进行通知.

代码:

/*** @time 2014年5月22日*/package observer;import java.util.ArrayList;/*** @author C.L.Wang**/public class WeatherData implements Subject {public ArrayList<Observer> observers;private float temperature;private float humidity; //湿度private float pressure;public WeatherData() {observers = new ArrayList<Observer>();}/* (non-Javadoc)* @see observer.Subject#registerObserver(observer.Observer)*/@Overridepublic void registerObserver(Observer o) {// TODO Auto-generated method stubobservers.add(o);}/* (non-Javadoc)* @see observer.Subject#removeObserver(observer.Observer)*/@Overridepublic void removeObserver(Observer o) {// TODO Auto-generated method stubint i = observers.indexOf(o);if (i>=0) {observers.remove(i);}}/* (non-Javadoc)* @see observer.Subject#notifyObervers()*/@Overridepublic void notifyObervers() {// TODO Auto-generated method stubfor (int i=0; i<observers.size(); ++i) {Observer observer = (Observer)observers.get(i);observer.update(temperature, humidity, pressure);}}public void measurementsChanged() {notifyObervers();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}}