首页 > 代码库 > Head First设计模式之Observer
Head First设计模式之Observer
观察者模式定义对象之间的一对多的依赖,当那一个对象(主题)状态改变时,所有的依赖者(观察者)都会收到通知并作出相应的动作。
观察者模式的使用非常广泛。
代码实现:
-------------------主题接口
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
---------- 具体主题
public class WeatherData implements Subject{
private ArrayList<Observer> observers ;
private float temperature ;
private float humidity ;
private float pressure ;
public WeatherData(){
this .observers = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
this .observers .add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observers .indexOf(o);
if (i >= 0){
observers .remove(i);
}
}
@Override
public void notifyObservers() {
for (int i=0; i< observers.size(); i++){
Observer o = observers .get(i);
o.update( this .temperature , this. humidity, this .pressure );
}
}
//当测量数据发送改变时,就通知这些观察者;
public void measurementChanged(){
notifyObservers();
}
//模拟实时监测数据的改变
public void setMeasurement( float temperature, float humidity, float pressure){
this .temperature = temperature;
this .humidity = humidity;
this .pressure = pressure;
measurementChanged();
}
}
-----------------观察者接口
public interface Observer {
public void update(float temp, float humidity, float pressure);
}
-----------辅助接口
public interface DisplayElement {
public void display();
//布告板显示的时候调用这个方法;
}
--------------具体观察者
//当前天气状况布告板
public class CurrentConditionDisplay implements Observer, DisplayElement{
private float temperature ;
private float humidity ;
private Subject weatherData ;
//用WeatherData作为构造器参数,作为注册之用
public CurrentConditionDisplay(Subject weatherData){
this .weatherData = weatherData;
weatherData.registerObserver( this );
}
@Override
public void display() {
System. out .println("CurrentConditionDisplay: " + this .temperature + " F degrees and "
+ this .humidity + "% humidity..");
}
@Override
public void update(float temp, float humidity, float pressure) {
//先把状态改变保存起来,而后进行业务处理(显示)
this .temperature = temp;
this .humidity = humidity;
display();
}
}
------------
//测试程序,其他的布告板实现也是类似的
public class WeatherStation {
public static void main(String[] args) {
WeatherData data =http://www.mamicode.com/ new WeatherData();
CurrentConditionDisplay ccd = new CurrentConditionDisplay(data);
//改变主题状态
data.setMeasurement(80, 50, 100);
}
}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。