观察者模式

前言

最近在看设计模式,所以打算写一些设计模式相关笔记,有兴趣的可以看看,一起讨论学习

认识观察者模式

我们看看报纸和杂志的订阅是怎么回事:

1.报社的业务是出版报纸。

2.向某家报订阅报纸,只要他有新报纸出版,就会给你送来。只要你是他们的用户,你就会一直收到新报纸。

3.当你不想看报纸的时候,取消订阅,他们就不会再送新报纸来。

4.只要报社还在运营,就会一直人(或单位)向他们订阅报纸或取消订阅报纸。

出版者+订阅者=观察者模式

如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名称不太一样:出版者改称为“主题”(Subject),订阅者改称为“观察者”(Observer)。

让我们来看得更仔细一点:

这里写图片描述

定义观察者模式

当你试图勾勒观察者模式时,可以利用报纸订阅服务,以及出版者和订阅者比拟这一切。

在真实的世界中,你通常会看到观察者模式被定义成:

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

难察者模式定义了一系列对象之间的一对多关系。
当一个对象改变状态,其他依赖者都会收到通知。

主题和观察者定义了一对多的关系。观察者依赖子此主题,只要主题状态一有变化,观察者就会被通知。根据通知的风格,观察者可能因此新值而更新。

稍后你会右到,实现观察者模式的方法不只一种,但是以包含Subject与Observer接口的类设计的做法最常见。

这里写图片描述

实例:

气象监测应用的概况

此系统中的三个部分是气象站(获取实际气象数据的物理装置),WeatherDate对象(追踪来自气象站的数据,并更新布告栏)和布告栏

WeatherData对象知道如何跟物理气象站联系,以取得更新的数据。WeatherData对象会随即更新三个布告板的显示:目前状况(温度、湿度、气压)、气象统计和天气预报。

如果我们选择接受这个项目,我们的工作就是建立一个应用,利用WeatherData对象取得数据,并更新三个布告板:目前状况.气象统计和天气预报。

布告栏(观察者),WeatherData对象(主题)

Observer.java

public interface Observer {

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

}

subject.java

public interface subject {

    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObserver();

}

DisplayElement.java

public interface DisplayElement {

    public void display();
}

CurrentConditionDisplay.java

public class CurrentConditionDisplay implements Observer,DisplayElement{

    private float temp;
    private float humidity;
    private float pressure;
    private subject WeatherData;

    CurrentConditionDisplay(WeatherData a){
        this.WeatherData=a;
        a.registerObserver(this);
    }
    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("temp="+temp+"\nhumidity="+humidity+"\npressure="+pressure);
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        // TODO Auto-generated method stub
        this.pressure=pressure;
        this.humidity=humidity;
        this.temp=temp;
        display();
    }

}

Observer.java

public interface Observer {

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

Test.java

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        WeatherData w=new WeatherData();
        CurrentConditionDisplay a=new CurrentConditionDisplay(w);
        w.setMeasurements(80, 30, 4);
        w.setMeasurements(8, 3, 4);
    }

}

最后

观察者设计模式差不多就这些,Java源码中也用了观察者模式,比如Swing的添加事件监听。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页