java和Spring中观察者模式的应用详解

我来详细讲解一下“java和Spring中观察者模式的应用详解”的完整攻略。

什么是观察者模式?

观察者模式(Observer Pattern)是一种行为型设计模式,也叫做发布-订阅模式(Publish/Subscribe),用于定义对象之间的一种一对多的依赖关系。当一个对象的状态改变时,所有依赖于它的对象都会收到通知并自动更新。观察者模式的核心思想就是解耦,将观察者和被观察者分离开来,使系统能够更好地应对变化。

java中观察者模式的应用

在java中,观察者模式 应用广泛,比如AWT/Swing中的事件处理机制、JMS中的消息监听器模式、Java事件处理器、Servlet中的监听器、Spring框架中的事件驱动模型等等。

下面来看一个简单的java代码示例。

示例1:

public interface Observer {  
    public void update(Object obj);  
}  

public interface Subject {  
    public void attach(Observer observer);  
    public void detach(Observer observer);  
    public void notifyObservers();  
}  

public class ConcreteSubject implements Subject {  
    private List<Observer> observerList = new ArrayList<Observer>();  
    private Object obj;  

    @Override  
    public void attach(Observer observer) {  
        observerList.add(observer);  
    }  

    @Override  
    public void detach(Observer observer) {  
        observerList.remove(observer);  
    }  

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

    public void setObj(Object obj) {  
        this.obj = obj;  
        notifyObservers();  
    }  
}  

public class ConcreteObserver implements Observer {  
    @Override  
    public void update(Object obj) {  
        System.out.println("Object has been updated: " + obj.toString());  
    }  
}  

//test 
public class Main {  
    public static void main(String[] args) {  
        ConcreteSubject subject = new ConcreteSubject();  
        Observer observer = new ConcreteObserver();  
        subject.attach(observer);  
        subject.setObj("Hello World!");  
    }  
} 

解释:

  • Subject 接口定义了观察者所需要的接口,包括 attach()、detach()、notifyObservers() 方法。
  • ConcreteSubject 类是具体主题角色,继承了 Subject 接口并重写其中的方法。
  • Observer 接口定义了观察者所需要的接口,包括 update() 方法。
  • ConcreteObserver 类是具体观察者角色,继承了 Observer 接口并重写其中的方法。
  • 在 Main 类中,我们创建了 ConcreteSubject 和 ConcreteObserver 对象,并将 observer 对象添加到 subject 对象上,然后改变 subject 的状态,就会自动通知 observer。

Spring中观察者模式的应用

Spring框架在其事件驱动模型中实现了观察者模式。在Spring中,事件(Event)就是被观察者,而监听器(Listener)就是观察者。Spring 为事件和监听器之间的通信提供了 ApplicationEventPublisher 和 ApplicationListener 两个接口,具体实现类为 ApplicationContext 和 AbstractApplicationEventMulticaster。

下面看一个简单的Spring代码示例。

示例2:

@Component
public class MyEventPublisher {
    @Autowired
    private ApplicationContext applicationContext;

    public void publishEvent(MyEvent event) {
        applicationContext.publishEvent(event);
    }
}

@Component
public class MyEventListener {

    @EventListener
    public void handleEvent(MyEvent event) {
        System.out.println("Receive event: " + event.getMessage());
    }
}

public class MyEvent extends ApplicationEvent {
    private String message;

    public MyEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

//test
public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.scan("com.example");
        context.refresh();

        MyEventPublisher eventPublisher = context.getBean(MyEventPublisher.class);
        eventPublisher.publishEvent(new MyEvent(this, "Hello World!"));

        context.close();
    }
}

解释:

  • MyEventPublisher 类是事件的发布者,通过 ApplicationContext 接口的 publishEvent() 方法发布事件。
  • MyEventListener 类是事件的监听器,使用 @EventListener 注解标记在 handleEvent() 方法上,当 MyEvent 事件发布时,handleEvent() 方法会被自动调用。
  • MyEvent 类是 MyEventPublisher 所要发布的事件,继承了 ApplicationEvent 类。
  • 在 Main 类中,我们创建了 AnnotationConfigApplicationContext 对象,并扫描 com.example 包,然后创建 MyEventPublisher 对象,发布 MyEvent 事件。此时,MyEventListener 的 handleEvent() 方法会被自动调用,输出 "Receive event: Hello World!"。

这就是java和Spring中观察者模式的应用详解。观察者模式是一种非常常用的设计模式,可以帮助我们实现对象之间松耦合的关系,使系统更加灵活、扩展性更强。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java和Spring中观察者模式的应用详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java利用JEXL实现动态表达式编译

    介绍 本文主要介绍了利用Java的JEXL库实现动态表达式编译的完整攻略。JEXL是一个Java表达式语言,由Apache Commons开发,可以用来解释执行动态生成的表达式。 步骤 引入依赖 首先需要在项目中引入JEXL依赖,可以使用Maven或手动导入jar包。 Maven依赖: <dependency> <groupId>or…

    Java 2023年5月27日
    00
  • JAVA实现按时间段查询数据操作

    JAVA实现按时间段查询数据操作的完整攻略如下: 步骤一:连接数据库 首先,需要在Java代码中连接到数据库。一般使用JDBC驱动连接数据库。以下是连接MySQL数据库的示例代码: import java.sql.*; public class MySqlDatabase { private static final String DRIVER_NAME =…

    Java 2023年5月20日
    00
  • Spring Security全新版本使用方式

    下面是“Spring Security全新版本使用方式”的完整攻略。 一、什么是Spring Security? Spring Security是一个开源的安全框架,为Spring应用提供了一组安全服务,用于Web应用程序和服务保护。它提供了身份验证和授权,防止攻击,保护数据等一系列安全功能。因此Spring Security成为了Java领域中常用的安全框…

    Java 2023年6月3日
    00
  • 华为java社招面试题目、参考答案及全部流程详解

    华为Java社招面试攻略 前言 本文将为求职者介绍华为Java社招面试的题目、参考答案以及全部流程,希望对想要应聘华为Java工程师职位的求职者有所帮助。本文的内容分为三个部分:准备工作、面试题目及参考答案、面试流程。 准备工作 对Java编程基础有扎实的掌握。 掌握Java面向对象编程思想及相关技术,如多态、抽象类、接口、泛型等。 掌握常用Java框架和工…

    Java 2023年5月20日
    00
  • Java数组的去重

    Java数组去重是一个非常基础和常见的操作,本文将介绍两种常见的去重方法:使用Set去重和使用Stream去重。 使用Set去重 使用Set来去重是最为常见的一种方式,其原理很简单,就是将数组转换为Set,再将Set转换为数组即可。 示例代码如下: public static int[] removeDuplicates(int[] arr) { Set&l…

    Java 2023年5月26日
    00
  • SpringBoot结合JWT登录权限控制的实现

    下面就来详细讲解“SpringBoot结合JWT登录权限控制的实现”的攻略。 第一步:添加Maven依赖 在pom.xml文件中添加以下Maven依赖: <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId…

    Java 2023年5月20日
    00
  • Java使用split截取字符串过程解析

    Java使用split截取字符串过程解析 简介 在Java开发中,操作字符串是个基础的技能,而split()方法是经常使用的一个方法。本篇文章主要介绍split()方法的使用方式和内部实现原理。 split()方法原理 split()方法是Java中的字符串分割函数,它的签名如下所示: public String[] split(String regex) …

    Java 2023年5月27日
    00
  • Java编程中二维数组的初始化和基本操作实例

    Java编程中二维数组的初始化和基本操作实例 什么是二维数组? 在Java中,数组是一种引用数据类型。如果数组的元素也是数组,那么这个数组就称为二维数组。二维数组实际上就是一个包含其他数组的数组,对于一个二维数组,我们可以把它想象成一个表格,其中每一个元素都有行和列的下标来确定它的位置。 如何初始化二维数组? 在 Java 中,我们可以使用两种方式来初始化一…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部