设计模式-观察者模式

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

类图:


设计气象站:


代码:

三个接口:Subject、Observer、DisplayElement

/**

* Created by zyzhmily on 2018/5/20.

* 主题

*/

public interface Subject {

    public void registerObserver(Observer observer);

    public void removeObserver(Observer observer);

    public void notifyObserver();

}

/**

* Created by zyzhmily on 2018/5/20.

*/

public interface Observer {

    public  void update(float temperature,float humidity,float pressure);

}

/**

* Created by zyzhmily on 2018/5/20.

*/

public interface DisplayElement {

    public void display();

}

WeatherData:

/**

* Created by zyzhmily on 2018/5/20.

*/

public class WeatherData implements Subject {

    private ArrayList observers;

    private float temperature;

    private float humidity;

    private float pressure;

    public WeatherData(){

        observers=new ArrayList();

    }

    @Override

    public void registerObserver(Observer observer) {

        observers.add(observer);

    }

    @Override

    public void removeObserver(Observer observer) {

        int i=observers.indexOf(observer);

        if (i>=0){

            observers.remove(i);

        }

    }

    @Override

    public void notifyObserver() {

        for (int i=0;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();

    }

}

CurrentConditionsDisplay:

/**

* Created by zyzhmily on 2018/5/20.

*/

public class CurrentConditionsDisplay implements Observer,DisplayElement{

    private float temperature;

    private float humidity;

    private Subject weatherData;

    public CurrentConditionsDisplay(Subject subject) {

        this.weatherData=subject;

        weatherData.registerObserver(this);

    }

    @Override

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

        this.temperature=temperature;

        this.humidity=humidity;

        display();

    }

    @Override

    public void display() {

        System.out.println("Current conditions: "+temperature+" F degree and "+humidity+" % humidity");

    }

}

测试类:

/**

* Created by zyzhmily on 2018/5/19.

*/

public class PatternObserver {

    public static void main(String[] args){

          WeatherData weatherData=new WeatherData();

          CurrentConditionsDisplay currentConditionsDisplay=new CurrentConditionsDisplay(weatherData);

          weatherData.setMeasurements(80,65,30.4f);

    }

}

本文来自 《Head First 设计模式》

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 客户需求 程序设计 一个气象站对应着多个客户端,气象站的数据一发生变化,客户端的数据也要随着更新,这就形成了一种依...
    BlainPeng阅读 1,025评论 1 17
  • 一、观察者模式概述 +观察者模式又叫做发布-订阅模式观察者模式定义了一种一对多的依赖关系,让多个观察者对象同事监听...
    Mitchell阅读 251评论 0 0
  • Observer-提供了一种对象设计,让主题和观察者之间松耦合的对象行为模式。 在对象之间定义一对多的依赖,这样一...
    TheLittleSky阅读 162评论 1 1
  • 设计模式——观察者模式 很好理解的例子 例子:李斯监控韩非子衣食住行 一个抽象接口:被观察者接口 一个抽象接口:抽...
    书笔年华阅读 359评论 0 0
  • 版权声明:本文为 Codeagles 原创文章,可以随意转载,但必须在明确位置注明出处!!! 观察者模式 什么是观...
    Codeagles阅读 499评论 0 2