设计模式——订阅模式(观察者模式)

栏目: 后端 · 发布时间: 6年前

内容简介:《Head First设计模式》笔记整理...欢迎交流...

《Head First设计模式》笔记整理...欢迎交流...

定义

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

OO原则

  • 封装变化
  • 多用组合,少用继承
  • 针对接口编程,而不是针对实现编程
  • 为了交互对象之间的松耦合而努力

一对多关系

设计模式——订阅模式(观察者模式)

定义类图

设计模式——订阅模式(观察者模式)

松耦合的威力

松耦合:当两个对象之间松耦合,他们依然可以交互,但是不太清楚彼此的细节。

观察者模式让主题和对象之间松耦合。

为什么呢?

关于观察者的一切,主题只知道观察者实现看某个接口(即Observer接口)。主题不需要知道观察值是谁,做了些什么或其他任何细节。

建立一个气象站

已知由气象站提供WeatherData对象,用来追踪目前的天气状况(温度、湿度、气压)。我们需要建立三个布告板(目前状况、气象统计、天气预报),分别显示目前的状况。并且要求此应用是可以扩展的。

设计模式——订阅模式(观察者模式)

public interface Subject {
    public void registerObserver(Observer o); //传入一个观察者变量,用来注册观察者
    public void registerObserver(Observer o); //传入一个观察者变量,用来删除观察者
    
    public void notifyObserver(); //当主题状态改变时,通知观察者

}

public interface Observer { // 所有的观察者都必须实现update方法,以实现观察者接口
    public void update(float temp, float humidity, float pressure); //当气象状态值改变时,主题会把这些状态值当做方法的参数,传递给观察者
}

public interface DisplayElement {
    public void display(); // DisplayElement接口只包含一个方法,那就是display。当不高者需要显示时,调用此接口
}

在weatherData中实现主题接口

public class WeatherData implements Subject {
    private ArrayList observers;
    private float temoerature; // 温度
    private float humidity; // 湿度
    private float pressure; // 气压
    
    public void registerObserver(Observer o) {
        observers.add(o);
    }
    
    public void removeObserver(Observer o) {
        int i = observers.indexof(o);
        if(i >= 0) {
            observers.remove(o);
        }
    }
    
    public void notifyObserver(Observer o) {
        for(int i = 0; i < observers.size(); i++) {
            Observer observer = (Observer) observers.get(i);
            observers.update(temoerature, humidity, pressure);
        }
        
    }
    
    public void measurementsChanged() {
        notifyObservers(); // 当从气象站得到耿勋观测值时,我们通知观察者
    }
    
    public void setMeasurements(float temoerature, float humidity, float pressure) { // 这是一个测试方法
        this.temoerature = temoerature;
        this.humidity = humidity;
        this.pressure = pressure;
        this.measurementsChanged();
    }
    
    //WeatherData的其它方法
}

下面建立布告板

public class CurrentConditionDisplay inplements Observer, DsiplayElement {
    privete float temperature;
    private float humidity;
    private Subject weatherData;
    
    public CurrentConditionDisplay(Subject weatherDate) { //构造器需要WeatherData对象
        this.weatherDate = weatherDate;
        weatherDate.registerOvserver(this);
    }
    
    public void update(temperature, humidity, weatherData) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.display();
    } 
    
    public void display() {
        System.out.print("Current conditions:" + this.temperature + "F degrees and " + this.humidity + "% humidity");
    }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大话存储Ⅱ

大话存储Ⅱ

张冬 / 清华大学出版社 / 2011-5 / 99.00元

《大话存储2:存储系统架构与底层原理极限剖析》内容简介:网络存储是一个涉及计算机硬件以及网络协议/技术、操作系统以及专业软件等各方面综合知识的领域。目前国内阐述网络存储的书籍少之又少,大部分是国外作品,对存储系统底层细节的描述不够深入,加之术语太多,初学者很难真正理解网络存储的精髓。《大话存储2:存储系统架构与底层原理极限剖析》以特立独行的行文风格向读者阐述了整个网络存储系统。从硬盘到应用程序,对......一起来看看 《大话存储Ⅱ》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具