如何用CDI事件实现观察者模式?

时间:2014-04-30 11:26:39

标签: java events cdi observer-pattern

在我的系统中,我有两个场景:

  1. 组件X产生由Y观察到的事件。
  2. 组件X产生应由组件F观察到的事件.F决定是否应忽略或修改事件并将其传递给Y.
  3. 是否可以使用CDI事件实现它?

2 个答案:

答案 0 :(得分:1)

CDI仅提供广播样式/主题事件的功能。 CDI中没有事件过滤。

我能想到的唯一方法就是想出一个限定词。也许F可以@Observes @A @B SomeObjectY可以@Observes @C @B SomeObject。当F获得某个事件时,它可以使用@C @B作为限定符来重新启动它。

答案 1 :(得分:0)

我会尝试在事件生成器和事件使用者之间创建某种代理:

class EventProducer{
    @Inject private Event<EventObject> event;

    public void produce(){
        event.fire(new EventObject());
    }
}

代理:

class EventsProxy{

    @Inject private Event<EventObjectForY> event_1;
    @Inject private Event<EventObjectForF> event_2;

    void observe(@Observes EventObject){
        if(eventObjectEligibleForF()){
            EventObjectForF f = copyEventObjectToEventObjectForF();
            event_2.fire(f);
        }
        EventObjectForY y = copyEventObjectToEventObjectForY();
        event_2.fire(y);
    }
}

消费者:

class EventConsumer{
    public consume(@Observes EventObjectForY obj){
    }
}

但请记住,这只是伪代码。