数据总线模式
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());
}
}