java设计模式之观察者模式

观察者模式:定义了对象之间的一对多依赖,当一个对象状态改变时,它所有的依赖者都会接收到通知并自动更新。
为了降低对象之间的耦合度,我们使用接口,对于观察者的一切,主题只知道观察者实现了什么接口
主题是真正拥有数据的人,观察者是主题的依赖者,在数据变化时更新。比许多对象控制同一个数据要好的多

整理一个简单示例:

/**

  • @author mj

  • 主题接口
    */
    public interface Subject {

    //注册观察者
    public void registerObserver(Observer observer);

    //删除观察者
    public void removeObserver(Observer observer);

    //当主题状态改变,这个方法用来通知所有的观察者
    public void notifyObserver();
    }

/**

  • @author mj

  • 所有的观察者都要实现观察者接口,实现update方法
    */
    public interface Observer {

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

/**

  • @author mj

  • 主题的实现
    */
    public class WeatherData implements Subject {

    //创建ArrayList,用来存放观察者
    private ArrayList observers;

    //三种气象数据
    private float temperature;
    private float humidity;
    private float pressure;

    //构造中实例化ArrayList
    public WeatherData(){

    observers = new ArrayList<Observer>();
    

    }
    //注册观察者只要加入集合
    @Override
    public void registerObserver(Observer observer) {

    // TODO Auto-generated method stub
    
    observers.add(observer);
    

    }

    //删除观察者就是直接删除对应下标的值
    @Override
    public void removeObserver(Observer observer) {

    // TODO Auto-generated method stub
    
    int index = observers.indexOf(observer);
    if(index>=0){
        observers.remove(index);
    }
    

    }

    //通知观察者,因为每个观察者都实现了update
    @Override
    public void notifyObserver() {

    // TODO Auto-generated method stub
    
    for(int i=0;i<observers.size();i++){
        Observer observer = observers.get(i);
        observer.update(temperature,humidity,pressure);
    }
    

    }

    //当气象站得到新的观测数据,通知观察者
    public void measurementsChange(){

    notifyObserver();
    

    }

    public void setMeasurements(float temperature,float humidity,float pressure){

    this.temperature = temperature;
    this.humidity = humidity;
    this.pressure = pressure;
    
    measurementsChange();
    

    }
    }

/**

  • @author mj

  • 其中一个面板,也是真正的观察者
    */
    public class CurrentConditionsDisplay implements Observer, DisplayElement {

    private float temp;
    private float humidity;
    private float pressure;
    private Subject weatherData;

    public CurrentConditionsDisplay(Subject weatherData){

    this.weatherData = weatherData;
    weatherData.registerObserver(this);
    

    }

    @Override
    public void display() {

    // TODO Auto-generated method stub
    System.out.println("Current Conditions:Humidity--"+humidity+",Pressure--"
            +pressure+",Temp--"+temp);
    

    }

    @Override
    public void update(float temp, float humidity, float pressure) {

    // TODO Auto-generated method stub
    this.temp = temp;
    this.humidity = humidity;
    this.pressure = pressure;
    
    display();
    

    }

}

/**

  • @author mj

  • 用于显示面板显示内容的接口
    */
    public interface DisplayElement {

    //面板要显示的内容是不同的,当参数发生变化时,这里就用来显示具体的内容
    public void display();
    }

/**

  • @author mj

  • 测试类
    */
    public class WeatherStation {

    public static void main(String[] args) {

    // TODO Auto-generated method stub
    
    //主题
    WeatherData weatherData = new WeatherData();
    
    //一系列的观察者
    CurrentConditionsDisplay currentConditionsDisplay = 
            new CurrentConditionsDisplay(weatherData);
    
    weatherData.setMeasurements(80, 65, 30.4f);
    
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    weatherData.setMeasurements(30, 30, 30);
    

    }

}

运行结果

你可能感兴趣的:(观察者模式)