美文网首页
数据总线模式

数据总线模式

作者: 石器时代小古董 | 来源:发表于2018-02-06 16:32 被阅读0次
    框架可以通过发送特定的数据 触发特定的组件
    

    一、核心的数据分发器

    1.Member 代表订阅的组件
    2.subscribe:将所有的业务组件加入到了一个集合中
    3.publish: 触发事件,尝试像所有订阅的事件集合中出入该类型数据,由他们决定是否处理

     */
    public class DataBus {
      private static final DataBus INSTANCE = new DataBus();
      private final Set<Member> listeners = new HashSet<>();
    
      public static DataBus getInstance() {
        return INSTANCE;
      }
      public void subscribe(final Member member) {
        this.listeners.add(member);
      }
      public void unsubscribe(final Member member) {
        this.listeners.remove(member);
      }
      public void publish(final DataType event) {
          event.setDataBus(this);
         for(Member m:listeners){
            m.accepts(event);
         }
       }
    }
    

    数据类型

    public class MessageData extends AbstractDataType {
      private final String message;
      public MessageData(String message) {
        this.message = message;
      }
      public String getMessage() {
        return message;
      }
      public static DataType of(final String message) {
        return new MessageData(message);
      }
    }
    

    被触发的模块

    accept:代表这个模块处理什么样的数据 是否处理发过来的消息

    public interface Member extends Consumer<DataType> {
      void accept(DataType event);
    }
    

    这是一个成员的例子,当accept方法在DataBus中触发时,这个模块会自己判断是否是需要它处理的数据
    如果是就会执行相应的功能--handleEvent

    public class MessageCollectorMember implements Member {
    
      private List<String> messages = new ArrayList<>();
    
      @Override
      public void accept(final DataType data) {
        if (data instanceof MessageData) {
          handleEvent((MessageData) data);
        }
      }
    
      private void handleEvent(MessageData data) {
        LOGGER.info(String.format("%s sees message %s", name, data.getMessage()));
        messages.add(data.getMessage());
      }
    }
    

    相关文章

      网友评论

          本文标题:数据总线模式

          本文链接:https://www.haomeiwen.com/subject/rgmgzxtx.html