資料匯流排模式

weixin_34402408發表於2018-02-06
框架可以通過傳送特定的資料 觸發特定的元件

一、核心的資料分發器

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());
  }
}

相關文章