Java面试题:描述观察者模式的工作原理及其在Java中的应用。

简介: Java面试题:描述观察者模式的工作原理及其在Java中的应用。

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象(称为观察者)的状态发生变化时,所有依赖于它的对象(称为订阅者)都将得到通知并自动更新。

工作原理:

观察者模式包含两个主要角色:

  1. Subject(主题):也称为观察目标,它负责维护一个观察者列表。当主题的状态发生变化时,会通知所有注册的观察者。
  2. Observer(观察者):订阅主题的状态变化,并在接到通知时根据主题的改变更新自己的状态。

协作:

  • Subject注册Observer到它的观察者列表中。
  • 当Subject的状态发生变化时,它会通知所有注册的Observer。
  • Observer接收到通知后,根据Subject的状态变化来更新自己的状态。

在Java中的应用:

Java中的java.util.Observablejava.util.Observer接口是实现观察者模式的基础。下面是一个简单的示例:

import java.util.Observable;
import java.util.Observer;
// 被观察者
class WeatherData extends Observable {
    private float temperature;
    private float humidity;
    private float pressure;
    public void setData(float temp, float humidity, float pressure) {
        this.temperature = temp;
        this.humidity = humidity;
        this.pressure = pressure;
        // 数据变化,通知观察者
        setChanged();
        notifyObservers();
    }
    public float getTemperature() {
        return temperature;
    }
    
    // 其他获取数据的函数...
}
// 观察者
class CurrentConditions implements Observer {
    private float temperature;
    private float humidity;
    public CurrentConditions(WeatherData weatherData) {
        weatherData.addObserver(this);
    }
    public void update(Observable o, Object arg) {
        WeatherData weatherData = (WeatherData)o;
        temperature = weatherData.getTemperature();
        humidity = weatherData.getHumidity();
        // 更新用户界面
    }
    // 其他更新UI的函数...
}
public class ObserverPatternDemo {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        CurrentConditions currentConditions = new CurrentConditions(weatherData);
        // 模拟数据变化,观察者将收到通知
        weatherData.setData(20.0f, 65.0f, 30.0f);
    }
}

在这个例子中,WeatherData类是Subject,它有一个setData方法,当这个方法被调用时,会通知所有注册的Observer。CurrentConditions类是Observer,它实现了Observer接口,并在构造函数中注册了自己到WeatherData。当WeatherData的状态发生变化时,CurrentConditions会接收到通知并更新自己的状态。

观察者模式的优点在于它可以建立一种松耦合的关系,使得Subject和Observer可以独立变化,不需要知道彼此的具体实现细节。这使得系统更加灵活和可扩展。

相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
90 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2月前
|
消息中间件 测试技术 数据库
吊打面试官!应用间交互如何设计?
【10月更文挑战第18天】设计应用间交互需从明确需求、选择合适方式、设计协议与数据格式、考虑安全性和权限管理、进行性能优化和测试五个方面入手。明确功能和用户需求,选择接口调用、消息队列、数据库共享或文件交换等方式,确保交互高效、安全、可靠。展示这些能力将在面试中脱颖而出。
|
4月前
|
JavaScript
【Vue面试题十四】、说说你对vue的mixin的理解,有什么应用场景?
这篇文章详细介绍了Vue中`mixin`的概念、应用场景和源码分析,解释了`mixin`如何用于代码复用、功能模块化,并通过实际代码示例展示了在Vue组件中局部混入和全局混入的使用方式。
【Vue面试题十四】、说说你对vue的mixin的理解,有什么应用场景?
|
4月前
|
并行计算 数据挖掘 大数据
[go 面试] 并行与并发的区别及应用场景解析
[go 面试] 并行与并发的区别及应用场景解析
|
4月前
|
算法 Java 索引
【Java集合类面试四】、 描述一下Map put的过程
这篇文章详细描述了HashMap中put操作的过程,包括首次扩容、计算索引、插入数据以及链表转红黑树和可能的再次扩容。
【Java集合类面试四】、 描述一下Map put的过程
|
4月前
|
JavaScript 前端开发
【Vue面试题二十一】、Vue中的过滤器了解吗?过滤器的应用场景有哪些?
这篇文章介绍了Vue中的过滤器,包括过滤器的定义、使用方式、串联使用以及在Vue 3中的废弃情况,并探讨了过滤器在文本格式化、单位转换等场景下的应用,同时分析了过滤器在Vue模板编译阶段的工作原理。
【Vue面试题二十一】、Vue中的过滤器了解吗?过滤器的应用场景有哪些?
|
4月前
|
JavaScript 程序员 数据安全/隐私保护
【Vue面试题二十】、你有写过自定义指令吗?自定义指令的应用场景有哪些?
这篇文章详细介绍了Vue中的自定义指令,包括指令系统的概念、如何实现自定义指令的全局和局部注册,以及自定义指令的钩子函数。文章还提供了几个自定义指令的应用场景示例,如表单防止重复提交、图片懒加载和一键复制功能,展示了自定义指令的灵活性和强大功能。
【Vue面试题二十】、你有写过自定义指令吗?自定义指令的应用场景有哪些?
|
4月前
|
算法
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
|
4月前
|
缓存 安全 Java
面试官:说说volatile应用和实现原理?
面试官:说说volatile应用和实现原理?
48 1
|
4月前
|
Java
描述 Java 中的重载和重写
【8月更文挑战第22天】
21 0