数据总线的简单实现

场景题:设计一个简单的数据总线,需要支持订阅发布,你能用Java写出核心部分的伪代码吗

1. UML

数据总线的简单实现_第1张图片
如图所示,首先,通过EventBus 注册<事件类型,监听者>,
使用时,通过EventBus发布事件,就可实现在Listener的onEvent方法中接收其监听的事件。
这样就可以实现在事件总线一端发布Event对象,在对应的Listener端接收Event对象

2. 代码:

2.1 事件总线EventBus

public class EventBus {
    //<事件类型,listener>
    private final HashMap<Class<?>, List<Listener>> subs=new HashMap<>();

    public void subscribe(Class<?> eventType,Listener listener ){
        if(!subs.containsKey(eventType)){
            subs.put(eventType,new ArrayList<>());
        }
        subs.get(eventType).add(listener);

    }
    public void unSubscribe(Class<?> eventType,Listener listener ){
        if(!subs.containsKey(eventType)){
            return;
        }
        subs.get(eventType).remove(listener);


    }

    public void publish(Object event){
      if(subs.containsKey(event.getClass())){
          for (Listener l:subs.get(event.getClass())){
              l.onEvent(event);
          }

      }

    }

}

2.2 Listener

public interface Listener {
    
    void onEvent(Object event);
}
public class AListener implements Listener {
    @Override
    public void onEvent(Object event) {
        if(event instanceof GuestComeEvent){
            System.out.println("客人来了:"+ ((GuestComeEvent) event).getMessage());
        }
    }
}

2.3 传递的事件Event

public class GuestComeEvent {
    private String message;

    public GuestComeEvent(String message){
        this.message=message;
    }
    public String getMessage(){
        return message;
    }

}

2.4 使用

public class Main {
    public static void main(String[] args) {
        EventBus eventBus = new EventBus();
		//注册监听者
        eventBus.subscribe(GuestComeEvent.class,new AListener());
        eventBus.subscribe(GuestGoEvent.class,new BListener());
        //发布事件
        eventBus.publish(new GuestComeEvent("灰灰"));
        eventBus.publish(new GuestGoEvent("灰灰"));
    }
}

你可能感兴趣的:(java,EventBus)