当前位置: 老葡京网站娱乐 > 编程语言 > 软件工程 > 正文

观察者模式(Observer Pattern) 详解

时间:2016-03-29 csdn博客 SpikeKing

老葡京网站娱乐 www.sdguanhua.com 观察者模式(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) 
     */  
    @Override  
    public void registerObserver(Observer o) {  
        // TODO Auto-generated method stub  
        observers.add(o);  
    }  
      
    /* (non-Javadoc) 
     * @see observer.Subject#removeObserver(observer.Observer) 
     */  
    @Override  
    public void removeObserver(Observer o) {  
        // TODO Auto-generated method stub  
        int i = observers.indexOf(o);  
        if (i>=0) {  
            observers.remove(i);  
        }  
    }  
      
    /* (non-Javadoc) 
     * @see observer.Subject#notifyObervers() 
     */
    @Override
    public void notifyObervers() {  
        // TODO Auto-generated method stub  
        for (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();  
    }  
      
}