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可以独立变化,不需要知道彼此的具体实现细节。这使得系统更加灵活和可扩展。

相关文章
|
12天前
|
消息中间件 存储 缓存
大厂面试高频:Kafka 工作原理 ( 详细图解 )
本文详细解析了 Kafka 的核心架构和实现原理,消息中间件是亿级互联网架构的基石,大厂面试高频,非常重要,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka 工作原理 ( 详细图解 )
|
9天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
33 2
|
14天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
14天前
|
存储 安全 Java
面试高频:Synchronized 原理,建议收藏备用 !
本文详解Synchronized原理,包括其作用、使用方式、底层实现及锁升级机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
面试高频:Synchronized 原理,建议收藏备用 !
|
14天前
|
Java
Java之CountDownLatch原理浅析
本文介绍了Java并发工具类`CountDownLatch`的使用方法、原理及其与`Thread.join()`的区别。`CountDownLatch`通过构造函数接收一个整数参数作为计数器,调用`countDown`方法减少计数,`await`方法会阻塞当前线程,直到计数为零。文章还详细解析了其内部机制,包括初始化、`countDown`和`await`方法的工作原理,并给出了一个游戏加载场景的示例代码。
Java之CountDownLatch原理浅析
|
SQL 存储 Java
Java 应用与数据库的关系| 学习笔记
快速学习 Java 应用与数据库的关系。
204 0
Java 应用与数据库的关系| 学习笔记
|
SQL 存储 Java
Java 应用与数据库的关系| 学习笔记
快速学习 Java 应用与数据库的关系。
191 0
Java 应用与数据库的关系| 学习笔记
|
SQL 存储 关系型数据库
Java应用与数据库的关系|学习笔记
快速学习Java应用与数据库的关系
Java应用与数据库的关系|学习笔记
|
7天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
5天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
下一篇
无影云桌面