您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页设计模式——模式

设计模式——模式

来源:保捱科技网
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<String, AbstractBusinessProcess> listenerMap = new ConcurrentHashMap<>();

    /**
     * 数据变更处理类注册
     * 参数根据实际业务 场景而定
     */
    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、事件
①声明一个天气事件的抽象类

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


4、触发机制
①触发


②播放结果


5、优化广播器(低耦合,高内聚)
将触发机制封装起来

 调用时,就感知不到内部的实现

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

 SpringBoot将和事件封装了起来。

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

 

3、触发机制


假如当前事件是Starting,遍历,每个首先判断是否实现了SmartApplicationListener接口
如果实现,就比对当前Starting事件是否为该supportsEventType中可以监听的事件。
如果没有实现,也是比对该是否可以监听Starting事件。


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

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务