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

yizhihongxing

我来详细讲解一下“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日

相关文章

  • MySql修改数据库编码为UTF8避免造成乱码问题

    以下是MySql修改数据库编码为UTF8的攻略,具体步骤如下: 步骤一:备份数据库 在进行数据库编码修改之前,为了防止意外情况导致数据丢失,应该先备份好原有的数据库。备份有多种方法,常见的有使用phpMyAdmin或通过mysqldump命令备份。 示例一:使用phpMyAdmin备份数据库 打开phpMyAdmin,选择要备份的数据库。 点击“导出”选项卡…

    Java 2023年5月20日
    00
  • java与scala数组及集合的基本操作对比

    Java与Scala数组及集合的基本操作可以进行如下对比: 数组 Java数组 Java中的数组是一个固定大小的容器,用来存储相同类型的元素。数组的大小在创建时是固定的,无法修改。 创建数组 Java中创建数组需要指定数组的类型和大小。如下所示,创建一个包含5个int类型元素的数组: int[] myArray = new int[5]; 插入/获取元素 J…

    Java 2023年5月26日
    00
  • java实现系统捕获异常发送邮件案例

    这里为您提供java实现系统捕获异常发送邮件的完整攻略。 1. 引入依赖 首先,在你的项目中需要引入邮件发送相关的依赖,例如Apache Commons Email等。如果你使用Maven进行依赖管理,可以添加以下依赖: <dependency> <groupId>org.apache.commons</groupId> …

    Java 2023年5月27日
    00
  • maven报错:Failed to execute goal on project问题及解决

    针对“maven报错:Failed to execute goal on project问题及解决”的问题,我将提供以下攻略: 问题描述 在使用maven构建工程的过程中,可能会遇到如下报错: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-jar-plugin:3.2.0:jar …

    Java 2023年6月2日
    00
  • Java之JsonArray用法讲解

    Java之JsonArray用法讲解 在Java中,经常需要使用Json格式的数据结构进行数据传递和交换。JsonArray是Json中的一个数据类型,本文将讲解JsonArray的用法。 JsonArray是什么? JsonArray是一个有序集合,其中包含了一系列的JsonElement。JsonElement是Json中的基本数据类型,可以是JsonA…

    Java 2023年5月26日
    00
  • Java使用JDBC实现Oracle用户认证的方法详解

    Java使用JDBC实现Oracle用户认证的方法 示例1:使用JDBC连接Oracle数据库 在Java中使用JDBC连接Oracle数据库,主要需要使用以下步骤: 加载数据库驱动程序; 创建数据库连接; 创建Statement对象; 执行SQL语句; 处理结果; 关闭连接。 以下是一个简单的示例代码: import java.sql.*; public …

    Java 2023年5月20日
    00
  • Java泛型变量如何添加约束

    Java泛型变量可以通过添加约束来限制其接受的类型范围。泛型约束指定了泛型变量(T)必须满足的条件,从而使泛型类型更加安全、清晰,减少运行时错误。 Java中常用的泛型约束主要包括: extends 约束:用于指定泛型变量(T)必须是某个类/接口的子类/实现类 super 约束:用于指定泛型变量(T)必须是某个类/接口的父类/实现类 下面分别介绍这两种约束的…

    Java 2023年5月26日
    00
  • OpenJDK源码解析之System.out.println详解

    OpenJDK源码解析之System.out.println详解 介绍 在Java中,要输出内容到控制台最常见的方式是使用 System.out.println() 方法。但是,了解该方法的运行机制以及它在底层的实现是非常有必要的。本文将侧重于介绍System.out.println()方法的实现原理,以及在OpenJDK源码中的具体实现。 System.o…

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