自定义监听器实现代码解耦

一、方案实现
自定义监听器可以有效解决大量业务代码大量耦合问题。
1、通知服务业务类

@Service
public class NotificationService {
    public void createActionNotification(Invoice invoice){
        System.out.println("创建发票成功,开始通知......");
    }

    public void cancelActionNotification(Invoice invoice){
        System.out.println("取消发票成功,开始通知......");
    }

    public void addRetrieveActionNotification(Invoice invoice){
        System.out.println("添加查询发票成功,开始通知......");
    }
}

2、相关监听器Listener

/**
 * 处理新增收款操作的通知
 *
 * @author huahua
 * @DATE 2025/8/2
 **/
public class InvoiceAddRetrieveActionListener implements InvoiceActionListener{
    private NotificationService notificationService;

    public InvoiceAddRetrieveActionListener(NotificationService notificationService){
        this.notificationService = notificationService;
    }

    @Override
    public void notify(InvoiceActionEnum invoiceAction, Invoice current, Invoice... before) {
        if(invoiceAction == InvoiceActionEnum.ADD_RETRIEVE){
            // 执行新增收款操作相关业务逻辑
            System.out.println("执行新增收款操作相关业务逻辑......");
            notificationService.addRetrieveActionNotification( current);
        }
    }
}
/**
 * 发票取消操作
 *
 * @author huahua
 * @DATE 2025/8/2
 **/
public class InvoiceCancelActionListener implements InvoiceActionListener{
    private NotificationService notificationService;

    public InvoiceCancelActionListener(NotificationService notificationService){
        this.notificationService = notificationService;
    }

    @Override
    public void notify(InvoiceActionEnum invoiceAction, Invoice current, Invoice... before) {
        // 处理发票取消操作
        if(invoiceAction == InvoiceActionEnum.CANCEL){
            System.out.println("处理发票取消操作......");
            notificationService.cancelActionNotification( current);
        }
    }
}
/**
 * 创建发票操作
 *
 * @author huahua
 * @DATE 2025/8/2
 **/
public class InvoiceCreateActionListener implements InvoiceActionListener{
    private NotificationService notificationService;

    public InvoiceCreateActionListener(NotificationService notificationService){
        this.notificationService = notificationService;
    }

    @Override
    public void notify(InvoiceActionEnum invoiceAction, Invoice current, Invoice... before) {
        if(invoiceAction == InvoiceActionEnum.CREATE){
            System.out.println("处理发票创建操作......");
            notificationService.createActionNotification( current);
        }
    }
}

3、发票操作通知监听器接口

/**
 * 发票操作通知监听器
 *
 * @author huahua
 * @DATE 2025/8/2
 **/
public interface InvoiceActionListener {
    /**
     * 通知监听器发票操作事件
     * 定义监听器接收发票操作通知的接口
     * 当发票操作发生时,监听器会收到通知,并执行相应的操作
     * @param invoiceAction 发票操作类型
     * @param current 当前发票对象
     * @param before 操作前发票对象
     */
    public abstract void notify(InvoiceActionEnum invoiceAction,Invoice current, Invoice... before);
}

4、发票操作监听器管理器

/**
 * 发票操作监听器管理器
 *
 * @author huahua
 * @DATE 2025/8/2
 **/
public class InvoiceActionListenerManager {
    private List<InvoiceActionListener> actionListenerList = new ArrayList<>();

    public void addListener(InvoiceActionListener observer){
        actionListenerList.add( observer);
    }

    /**
     * 通知所有监听器
     * 管理并通知所有已注册的监听器
     * 当发票发生操作时候,向所有注册的监听器发送通知
     * @param action
     * @param current
     * @param before
     */
    public void notify(InvoiceActionEnum action, Invoice current,Invoice... before){
        for (InvoiceActionListener listener : actionListenerList) {
            listener.notify(action, current, before);
        }
    }
}

5、监听器配置类
后续如有新增其他业务场景,只需要新增对应的Listener,在此添加Bean即可,扩展灵活。

/**
 * 监听器配置类
 *
 * @author huahua
 * @DATE 2025/8/2
 **/
@Configuration
public class InvoiceActionListenerConfig {
    @Bean
    InvoiceActionListenerManager invoiceActionListenerManager() {
        return new InvoiceActionListenerManager();
    }

    @Bean
    public InvoiceAddRetrieveActionListener invoiceAddRetrieveActionListener(InvoiceActionListenerManager invoiceActionListenerManager,
        NotificationService notificationService){
        InvoiceAddRetrieveActionListener invoiceAddRetrieveActionListener = new InvoiceAddRetrieveActionListener(notificationService);
        invoiceActionListenerManager.addListener(invoiceAddRetrieveActionListener);
        return invoiceAddRetrieveActionListener;
    }

    @Bean
    public InvoiceCancelActionListener invoiceCancelActionListener(InvoiceActionListenerManager invoiceActionListenerManager,
        NotificationService notificationService){
        InvoiceCancelActionListener invoiceCancelActionListener = new InvoiceCancelActionListener(notificationService);
        invoiceActionListenerManager.addListener(invoiceCancelActionListener);
        return invoiceCancelActionListener;
    }

    @Bean
    public InvoiceCreateActionListener invoiceCreateActionListener(InvoiceActionListenerManager invoiceActionListenerManager,
        NotificationService notificationService){
        InvoiceCreateActionListener invoiceCreateActionListener = new InvoiceCreateActionListener(notificationService);
        invoiceActionListenerManager.addListener(invoiceCreateActionListener);
        return invoiceCreateActionListener;
    }
}

二、项目结构及源码
在这里插入图片描述
源码下载,欢迎Star

参考资料
https://www.bilibili.com/video/BV1Xx8gzgE88/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=fa048399c8e5795a68c7af7fae98c938
https://blog.youkuaiyun.com/rgrt868/article/details/143681636
https://blog.youkuaiyun.com/lemon_TT/article/details/126063399

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值