Java一分钟之-设计模式:观察者模式与事件驱动

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 【5月更文挑战第17天】本文探讨了Java中实现组件间通信的观察者模式和事件驱动编程。观察者模式提供订阅机制,当对象状态改变时通知所有依赖对象。然而,它可能引发性能问题、循环依赖和内存泄漏。代码示例展示了如何实现和避免这些问题。事件驱动编程则响应用户输入和系统事件,但回调地狱和同步/异步混淆可能造成困扰。JavaFX事件驱动示例解释了如何处理事件。理解这两种模式有助于编写健壮的程序。

观察者模式(Observer Pattern)和事件驱动编程是Java中实现组件间通信的两种重要方式。在这篇博客中,我们将探讨这两种模式的基本概念、常见问题以及如何通过代码示例来避免这些问题。
image.png

1. 观察者模式 (Observer Pattern)

定义

观察者模式是一种行为设计模式,允许你定义一个订阅机制,当对象状态改变时,所有依赖它的对象都会得到通知并自动更新。

常见问题与易错点

  • 性能:大量观察者可能导致通知性能下降。
  • 循环依赖:观察者之间可能存在循环依赖,导致无限递归。
  • 内存泄漏:忘记删除观察者可能导致资源泄漏。

代码示例

import java.util.ArrayList;
import java.util.List;

interface Subject {
   
   
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

interface Observer {
   
   
    void update();
}

class ConcreteSubject implements Subject {
   
   
    private List<Observer> observers = new ArrayList<>();
    private String state;

    @Override
    public void registerObserver(Observer observer) {
   
   
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
   
   
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
   
   
        for (Observer observer : observers) {
   
   
            observer.update();
        }
    }

    public void setState(String state) {
   
   
        this.state = state;
        notifyObservers();
    }
}

class ConcreteObserver implements Observer {
   
   
    @Override
    public void update() {
   
   
        System.out.println("State has been updated.");
    }
}

public class Main {
   
   
    public static void main(String[] args) {
   
   
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        subject.registerObserver(observer);
        subject.setState("New State"); // Triggers update in observer
    }
}

2. 事件驱动编程

事件驱动编程是一种编程范式,其中程序响应用户输入、系统事件或其他异步触发的事件。

常见问题与易错点

  • 回调地狱:过多嵌套的回调函数可能导致代码难以阅读和维护。
  • 同步与异步:错误处理和同步/异步控制流的混淆可能导致程序逻辑错误。

JavaFX事件驱动示例

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class EventDrivenExample extends Application {
   
   

    @Override
    public void start(Stage primaryStage) {
   
   
        Button button = new Button("Click me!");
        button.setOnAction(new EventHandler<ActionEvent>() {
   
   
            @Override
            public void handle(ActionEvent event) {
   
   
                System.out.println("Button clicked!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(button);

        Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("Event Driven Example");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
   
   
        launch(args);
    }
}

在实际应用中,观察者模式和事件驱动编程常结合使用,如JavaFX和Swing框架。理解这两种模式并避免上述问题,可以帮助我们编写出更加健壮、可维护的程序。

目录
相关文章
|
2月前
|
设计模式 监控 Java
Kotlin - 改良设计模式 - 观察者模式
Kotlin - 改良设计模式 - 观察者模式
59 3
|
27天前
|
设计模式 存储 供应链
前端必须掌握的设计模式——观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,实现了一种订阅机制。它包含两个角色:**观察者**(订阅消息、接收通知并执行操作)和**被观察者**(维护观察者列表、发送通知)。两者通过一对多的关系实现解耦,当被观察者状态改变时,会通知所有订阅的观察者。例如,商店老板作为被观察者,记录客户的需求并在商品到货时通知他们。前端应用中,如DOM事件注册、MutationObserver等也体现了这一模式。
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
3月前
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
60 0
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
48 1
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
49 4
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
32 3
|
3月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
39 9
|
3月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
44 2