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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 【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框架。理解这两种模式并避免上述问题,可以帮助我们编写出更加健壮、可维护的程序。

目录
相关文章
|
22天前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
26天前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Combinator(功能模式)
【设计模式】JAVA Design Patterns——Combinator(功能模式)
|
27天前
|
设计模式 监控 Java
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
|
27天前
|
设计模式 Java 程序员
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
|
27天前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Builder(构造器模式)
【设计模式】JAVA Design Patterns——Builder(构造器模式)
|
4天前
|
设计模式 存储 安全
Java中的23种设计模式
Java中的23种设计模式
6 1
|
7天前
|
监控 Java 测试技术
Java一分钟之-Vert.x:轻量级事件驱动框架
【6月更文挑战第11天】Vert.x是一个轻量级的Java事件驱动框架,用于构建高性能微服务和响应式应用。它采用多-reactor线程模型,支持异步非阻塞IO,提供事件驱动、多语言支持、轻量级特性和模块化组件生态。本文关注Java,讨论了Vert.x中的常见问题,如阻塞事件循环、异常处理和资源泄露,并提供了解决方案。理解异步编程模型,利用Vert.x生态和进行有效监控是避免陷阱的关键。通过实践,开发者能更好地掌握Vert.x并构建高效应用。
19 1
|
11天前
|
设计模式 前端开发 NoSQL
设计模式第八讲:观察者模式和中介者模式详解
 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
171 0
|
12天前
|
设计模式 消息中间件 存储
跟着GPT学设计模式之观察者模式
观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其依赖对象都能够收到通知并自动更新。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。
14 1
|
19天前
|
设计模式 存储 前端开发
Java的mvc设计模式在web开发中应用
Java的mvc设计模式在web开发中应用