dami - 应用参考:局部(或对象)集成
DamiBus 可以作为全局总线使用。也可以作一个局部的总线(或实例级总线)。
应用1:对象属性变更(观查者模式)
设计一个用户对象,可提供属性变更通知能力
public class User {
private final DamiBus bus = new DamiBusImpl(new EventRouterPatterned(RoutingPath::new));
private String name;
public void setName(String name) {
this.name = name;
//通知
bus.send("property.name", new AbstractMap.SimpleEntry("name", name));
}
//监视单个属性
public <C> void onPropertyChanged(String key, Consumer<C> consumer) {
bus.<Map.Entry<String, C>>listen("property." + key, e -> {
consumer.accept(e.getPayload().getValue());
});
}
//监视所有属性
public void onPropertyChanged(BiConsumer<String, Object> consumer) {
bus.<Map.Entry<String, Object>>listen("property.*", e -> {
consumer.accept(e.getPayload().getKey(), e.getPayload().getValue());
});
}
}
应用示例:
User user = new User();
user.onPropertyChanged("name", v->{
System.out.println("name changed: "+v);
});
user.setName("noear");
应用2:作为上下文的一部分(为链路提供水平扩展)
设计一个流程上下文,带事件总线(为链路提供水平扩展)
public class FlowContext {
private final DamiBus eventBus = Dami.newBus();
public DamiBus eventBus() {
return eventBus;
}
}
应用示例(下面完全是假代码):
public class DemoApp {
public void eval(Chain chain){
FlowContext context = new FlowContext();
context.eventBus().<Node>listen("node.start", event -> {});
context.eventBus().<Node>listen("node.end", event -> {});
for(Node n1 : chain.getNodes()) {
nodeRun(n1, context);
}
}
public void nodeRun(Node n1, FlowContext context){
if(n1.type == 1){
context.eventBus().listen("on.completed", event -> {});
}
context.eventBus().send("node.start", n1);
n1.run();
context.eventBus().send("node.end", n1);
if(n1.type == 9){
context.eventBus().send("on.completed", n1);
}
}
}