观察者模式应用

package com.example.demo.event;

import org.springframework.context.support.AbstractApplicationContext;

import java.util.*;

public class AuthEventBus {
    private static Map<String, List<IAuthEventHandler>> EVENT_BUS = new HashMap();

    public static void addEvent(String handlerKey, IAuthEventHandler handler) {
        List<IAuthEventHandler> handlerList = new ArrayList<>();
        if (EVENT_BUS.containsKey(handlerKey)) {
            handlerList = EVENT_BUS.get(handlerKey);
        }
        handlerList.add(handler);
        Collections.sort(handlerList, new Comparator<IAuthEventHandler>() {
                    @Override
                    public int compare(IAuthEventHandler o1, IAuthEventHandler o2) {
                        return o1.getOrder() - o2.getOrder();
                    }
                }
        );
        EVENT_BUS.put(handlerKey, handlerList);
    }

    public static void emit(String handlerKey, AuthEvent event) {
        if (!EVENT_BUS.containsKey(handlerKey)) {
            return;
        }
        List<IAuthEventHandler> handlerList = EVENT_BUS.get(handlerKey);
        for (IAuthEventHandler handler : handlerList) {
            switch (event.getEventEnum()) {
                case BEFORE:
                    try {
                        handler.handlerBefore(event);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                case AFTER:
                    try {
                        handler.handlerAfter(event);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                default:
                    break;
            }
            if (!event.isContinueFlag()) {
                return;
            }
        }
    }

    public static  void initEvent(AbstractApplicationContext context){
    Map<String,Object> beanMap=context.getBeansWithAnnotation(AuthEventAnno.class);
    beanMap.forEach((key,eventHandler) ->{
        if(eventHandler instanceof IAuthEventHandler){
            AuthEventAnno annotation = eventHandler.getClass().getAnnotation(AuthEventAnno.class);
            addEvent(annotation.eventCode(), (IAuthEventHandler) eventHandler);
        }
    });

    }
}
package com.example.demo.event;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class AuthEvent {
    private boolean continueFlag=true;
    private AuthEventEnum eventEnum=AuthEventEnum.BEFORE;
    private Map<String,Object> eventDate=new HashMap<String,Object>();
    private Map<String,Object> eventArgs=new HashMap<String,Object>();
    private List<Map<String,Object>> eventDataList=new ArrayList<Map<String,Object>>();

    public AuthEvent() {
    }

    public AuthEvent(AuthEventEnum eventEnum, Map<String, Object> eventDate) {
        this.eventEnum = eventEnum;
        this.eventDate = eventDate;
    }

    public AuthEvent(Map<String, Object> eventDate) {
        this.eventDate = eventDate;
    }

    public AuthEvent(AuthEventEnum eventEnum, Map<String, Object> eventDate, Map<String, Object> eventArgs) {
        this.eventEnum = eventEnum;
        this.eventDate = eventDate;
        this.eventArgs = eventArgs;
    }

    public AuthEvent(boolean continueFlag, AuthEventEnum eventEnum, Map<String, Object> eventDate, Map<String, Object> eventArgs, List<Map<String, Object>> eventDataList) {
        this.continueFlag = continueFlag;
        this.eventEnum = eventEnum;
        this.eventDate = eventDate;
        this.eventArgs = eventArgs;
        this.eventDataList = eventDataList;
    }

    public boolean isContinueFlag() {
        return continueFlag;
    }

    public void setContinueFlag(boolean continueFlag) {
        this.continueFlag = continueFlag;
    }

    public AuthEventEnum getEventEnum() {
        return eventEnum;
    }

    public void setEventEnum(AuthEventEnum eventEnum) {
        this.eventEnum = eventEnum;
    }

    public Map<String, Object> getEventDate() {
        return eventDate;
    }

    public void setEventDate(Map<String, Object> eventDate) {
        this.eventDate = eventDate;
    }

    public Map<String, Object> getEventArgs() {
        return eventArgs;
    }

    public void setEventArgs(Map<String, Object> eventArgs) {
        this.eventArgs = eventArgs;
    }

    public List<Map<String, Object>> getEventDataList() {
        return eventDataList;
    }

    public void setEventDataList(List<Map<String, Object>> eventDataList) {
        this.eventDataList = eventDataList;
    }
}
package com.example.demo.event;


import java.lang.annotation.*;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthEventAnno {
    String eventCode() default "";
    String desc() default "";
    int order() default 0;
}
package com.example.demo.event;

public enum AuthEventEnum {
            BEFORE,
            AFTER
}
package com.example.demo.event;

public interface IAuthEventHandler {
    void handlerBefore(AuthEvent authEvent) throws Exception;
    void handlerAfter(AuthEvent authEvent) throws Exception;
    public int getOrder();
}
package com.example.demo.event;

import org.springframework.stereotype.Component;

@Component
@AuthEventAnno(eventCode ="XXXXX",desc="XXXXX")
public class test implements  IAuthEventHandler{

    @Override
    public void handlerBefore(AuthEvent authEvent) throws Exception {
        System.out.println(authEvent.getEventArgs());
    }

    @Override
    public void handlerAfter(AuthEvent authEvent) throws Exception {

    }

    @Override
    public int getOrder() {
        return 0;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值