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

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

内容简介:《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");
    }
}

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

查看所有标签

猜你喜欢:

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

An Introduction to Genetic Algorithms

An Introduction to Genetic Algorithms

Melanie Mitchell / MIT Press / 1998-2-6 / USD 45.00

Genetic algorithms have been used in science and engineering as adaptive algorithms for solving practical problems and as computational models of natural evolutionary systems. This brief, accessible i......一起来看看 《An Introduction to Genetic Algorithms》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码