设计模式——监听器模式

import lombok.extern.slf4j.Slf4j;

import javax.annotation.Resource;

@Slf4j
public class BaseProcess {

    // 具体方法根据业务逻辑而定
    @Resource
    private BusinessService businessService;

    protected void process(MultiMsg multiMsg) {
        businessService.excute();
    }
}
import lombok.extern.slf4j.Slf4j;

import javax.annotation.PostConstruct;

/**
 * 业务抽象执行类
 */
@Slf4j
public abstract class AbstractBusinessProcess extends BaseProcess {


    @PostConstruct
    protected void init() {
        registerListener();
    }

    /**
     * Listener注册
     */
    protected abstract void registerListener();

    @Override
    public void process(MultiMsg event) {
        log.info("处理公共逻辑");
        super.process(multiMsg);
        log.info("处理具体业务");
        this.handle(multiMsg);
    }

    protected abstract void handle(MultiMsg event);

}
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class BusinessService {

    public void excute(){
        log.info("执行基础代码");
    }

}
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class BusinessProcessDemo extends AbstractBusinessProcess {

    @Override
    protected void registerListener() {
        SelectListener.registerListener("demoType", "demoName", this);
    }


    @Override
    public void handle(MultiMsg event) {
        log.info("业务场景1");
    }


}
import lombok.Data;

@Data
public class MultiMsg {

    private String type;

    private String name;

    // 其他属性

}
package org.example.design;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Listener选择器
 */
public class SelectListener {

    /**
     * 数据处理Listener集合
     */
    private static Map listenerMap = new ConcurrentHashMap<>(64);

    /**
     * 数据变更处理类注册
     * 参数根据实际业务 场景而定
     */
    public static void registerListener(String type, String name, AbstractBusinessProcess listener) {
        String key = type + "_" + name + "_" + type;
        listenerMap.put(key.toLowerCase(), listener);
    }

    /**
     * 获取处理Listener
     */
    public static AbstractBusinessProcess getListener(String type, String name) {
        String key = type + "_" + name + "_" + type;
        return listenerMap.get(key.toLowerCase());
    }
}

其他例子

1、事件
①声明一个天气事件的抽象类

设计模式——监听器模式_第1张图片
②定义两个天气事件

设计模式——监听器模式_第2张图片

设计模式——监听器模式_第3张图片

2、监听器
①声明一个天气监听器的接口

在这里插入图片描述
②实现两个天气事件的监听器

设计模式——监听器模式_第4张图片 设计模式——监听器模式_第5张图片
3、广播器
①定义一个广播器的接口

设计模式——监听器模式_第6张图片
②实现广播器接口


③定义一个天气的广播器

设计模式——监听器模式_第7张图片
4、触发机制
①触发

设计模式——监听器模式_第8张图片
②播放结果

设计模式——监听器模式_第9张图片
5、优化广播器(低耦合,高内聚)
将触发机制封装起来

设计模式——监听器模式_第10张图片 调用时,就感知不到内部的实现

设计模式——监听器模式_第11张图片

二、SpringBoot的监听者模式
1、SpringBoot框架事件
SpringBoot框架事件

设计模式——监听器模式_第12张图片 SpringBoot将监听器和事件封装了起来。

设计模式——监听器模式_第13张图片

2、获取监听器列表
getApplicationListeners方法,会先查询监听器列表是否已经缓存过,如果没有,通过retrieveApplicationListeners方法取出监听器。
在retrieveApplicationListeners方法中,会遍历监听器,通过supportsEvent方法取出可以可以监听当前事件的监听器,并添加至队列中去。

设计模式——监听器模式_第14张图片 

3、触发机制

设计模式——监听器模式_第15张图片
假如当前事件是Starting,遍历监听器,每个监听器首先判断是否实现了SmartApplicationListener接口
如果实现,就比对当前Starting事件是否为该监听器supportsEventType中可以监听的事件。
如果没有实现,也是比对该监听器是否可以监听Starting事件。


4、自定监听器
①实现ApplicationListener接口,只不过监听事件则恒定为ApplicationStartedEvent
②实现SmartApplicationListener接口,可以通过supportsEventType,来自定义监听事件。
③注册方法与系统初始化器一样


版权声明:本文为CSDN博主「刘洋_RS6」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44667978/article/details/104363175

 

你可能感兴趣的:(设计模式,设计模式,java,spring)