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

目录
打赏
0
0
0
0
22
分享
相关文章
【原理】【Java并发】【synchronized】适合中学者体质的synchronized原理
本文深入解析了Java中`synchronized`关键字的底层原理,从代码块与方法修饰的区别到锁升级机制,内容详尽。通过`monitorenter`和`monitorexit`指令,阐述了`synchronized`实现原子性、有序性和可见性的原理。同时,详细分析了锁升级流程:无锁 → 偏向锁 → 轻量级锁 → 重量级锁,结合对象头`MarkWord`的变化,揭示JVM优化锁性能的策略。此外,还探讨了Monitor的内部结构及线程竞争锁的过程,并介绍了锁消除与锁粗化等优化手段。最后,结合实际案例,帮助读者全面理解`synchronized`在并发编程中的作用与细节。
58 8
【原理】【Java并发】【synchronized】适合中学者体质的synchronized原理
|
1月前
|
【原理】【Java并发】【volatile】适合初学者体质的volatile原理
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是写出高端的CRUD应用。2025年,我正在沉淀自己,博客更新速度也在加快。在这里,我会分享关于Java并发编程的深入理解,尤其是volatile关键字的底层原理。 本文将带你深入了解Java内存模型(JMM),解释volatile如何通过内存屏障和缓存一致性协议确保可见性和有序性,同时探讨其局限性及优化方案。欢迎订阅专栏《在2B工作中寻求并发是否搞错了什么》,一起探索并发编程的奥秘! 关注我,点赞、收藏、评论,跟上更新节奏,让我们共同进步!
118 8
【原理】【Java并发】【volatile】适合初学者体质的volatile原理
JVM实战—1.Java代码的运行原理
本文介绍了Java代码的运行机制、JVM类加载机制、JVM内存区域及其作用、垃圾回收机制,并汇总了一些常见问题。
JVM实战—1.Java代码的运行原理
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
【JAVA】生成accessToken原理
在Java中,生成accessToken用于身份验证和授权,确保合法用户访问受保护资源。流程包括:1. 身份验证(如用户名密码、OAuth 2.0);2. 生成唯一且安全的令牌;3. 设置令牌有效期并存储;4. 客户端传递令牌,服务器验证其有效性。常见场景为OAuth 2.0协议,涉及客户端注册、用户授权、获取授权码和换取accessToken。示例代码展示了使用Apache HttpClient库模拟OAuth 2.0获取accessToken的过程。
|
4月前
|
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
94 3
|
4月前
|
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
127 2
|
4月前
|
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
159 10
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
5月前
|
Java之CountDownLatch原理浅析
本文介绍了Java并发工具类`CountDownLatch`的使用方法、原理及其与`Thread.join()`的区别。`CountDownLatch`通过构造函数接收一个整数参数作为计数器,调用`countDown`方法减少计数,`await`方法会阻塞当前线程,直到计数为零。文章还详细解析了其内部机制,包括初始化、`countDown`和`await`方法的工作原理,并给出了一个游戏加载场景的示例代码。
102 3
Java之CountDownLatch原理浅析

热门文章

最新文章