设计模式——观察者模式

      一、定义

              一种一对多的依赖关系,让多个观察者对想同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察这对象,是它们能够自动更新自己。

     二、例子。

            气象台对天气实时监控,只要天气的温度湿度等等一有变化就公告栏就更新数据。

           UML图:

             

           代码:

            天气变化接口:          

public interface Subject(){
	public void registerObserver(Observer o);//添加公告栏
	public void removeObserver(Observer o);//取消公告栏
	public void notifyObservers();//通知公告栏更新
}

            天气变化数据改变实现:

public class WeatherData implements Subject{
	private ArrayList observers;
	private float temperature;
	private float humidity;
	private float pressure;
	//公告栏的模版
	public WeatherData(){
		observers= new ArrayList();
		
	}
      	//添加公告栏
	public void registerOvserver(Observer o ){
		observers.add(o);
	}
	//移除公告栏
	public void removeObserver(Observer o){
		int i=observers.indexOf(o);
		if(i>=0){
			observers.remove(i);
		}
		
	}
	//通知公告栏更新的信息
	public notifyObservers(){
		for(int i=0;i<observers.size();i++){
			Observer observer=(Observer)observer.get(i);
			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 interface Observer(){
	public void update(float temp,float humidity,float pressure);
}

公告栏显示接口:

public interface DisplayElement(){
	public void display();
}


公告栏:

public class CurrentConditionsDisplay implements Observer,DisplayElements{
	private float temperature;
	private float humidity;
	private Subject weatherData;
	//公告栏构造函数
	public CurrentConditionsDisplay(Subject weatherData){
		this.weatherData=weatherData;
		weatherData.registerOvserver(this);
	}
	//公告栏更新数据
	public void update(float temperature,float humidity,float,float pressure){
		this.temperature=temperature;
		this.humidity=humidity;
		display();
	}
	
	public void display(){
		System.out.println("Current conditions:"+ temperature+"F degress and "+humidity+"% humidity");
	}
}

客户端:

       

public class WeatherStation{
	public static void main(String[] args){
		WeatherData wetherData=new WeaterData();
		CurrentConditionsDisplay currentDisplay(weaterData);
		weaterData.setMeasurements(80,65,30.4f);
	}
}





 综述:

       观察者模式让双方都依赖于接口(或抽象),而不是依赖与具体,从而是的各自的变化都不会影响另一边的变化。公告板样式,显示数据的变化不会影响天气数据的变化。

      

posted @ 2013-04-26 16:51  夏至冬末  阅读(134)  评论(0编辑  收藏  举报