java设计模式-Head First设计模式之观察者模式

Head First设计模式之观察者模式



定义


观察者模式-在对象之间定义的一对多依赖,这样依赖,当一个状态改变状态,依赖它的对象都会收到通知,并自动更新

要点


1 观察者模式定义了对象之间的一对多关系
2 主题(也就是观察者)用一个共同的接口来更新观察者
3 观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者的接口
4 有多个观察者时,不可以依赖特定的顺序通知次序
5 java有多中观察者模式的实现,包括了通用的 java.util.Observable
6 此模式被应用在许多地方,比如JavaBeans、RMI

3 新增原则

1 为交互对象之间的松耦合设计而努力 

4 代码实例


package Observer;

public interface Observer {  
	   public void update(float temp,float humidity,float pressure);  
} 

package Observer;

public interface Subject {  
	  
    public void registerObserver(Observer o);  
    public void removeObserver(Observer o);  
    public void notifyObserver();  
}  



package Observer;

public interface DisplayElement {  
    public void display();  
}  


package Observer;

public class CurrentDisplay implements Observer,DisplayElement{  
	   private float temperature;  
	   private float humidity;  
	   private Subject weatherDate;  
	     
	   public CurrentDisplay(Subject weatherDate)  
	   {  
	       this.weatherDate=weatherDate;  
	       weatherDate.registerObserver(this);  
	   }  
	   public void update(float temperature,float humidity,float pressure)  
	   {  
	       this.temperature=temperature;  
	       this.humidity=humidity;  
	       display();  
	   }  
	   public void display()  
	   {  
	       System.out.println("目前状况是温度:"+temperature+"度     "+"湿度:"+humidity+"%");  
	   }  
} 


package Observer;

import java.util.ArrayList;  

public class WeatherData implements Subject {  
  
    private ArrayList observers;  
    private float temperature;  
    private float pressure;  
    private float humidity;  
  
    public WeatherData() {  
        observers = new ArrayList();  //加上一个ArrayList来记录观察者,此ArrayList是在构造器中产生的  
    }  
  
    public void registerObserver(Observer o) {  
        observers.add(o);                    //有观察者注册时,将其加到ArrayList后面  
    }  
  
    public void removeObserver(Observer o) {  
        int i = observers.indexOf(o);       //观察者取消注册时,将其从ArrayList中删除  
        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();  
    }  
  
}  


package Observer;

public class WeatherStation {  
    
    public static void main(String[] args)  
    {  
       WeatherData weatherData=new WeatherData();   //建立一个WeatherData对象  
       CurrentDisplay currentDisplay=new CurrentDisplay(weatherData);  //建立布告板,并把WeatherData传给它们   
         
       weatherData.setMeasurements(80, 65, 30.4f);  //模拟新的气象测量  
       weatherData.setMeasurements(82, 70, 29.2f);  
       weatherData.setMeasurements(78, 90, 29.2f);  
    }  
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值