数据总线模式

2018-02-06  本文已影响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());
  }
}
上一篇下一篇

猜你喜欢

热点阅读