2

我有一个已注册的侦听器列表的可观察(来自观察者/可观察模式)。
当事件发生时,通知代码会:

if(event == TYPE_A){  
  for(Listener l:listeners){  
       l.fireEventA();  
  }  
else if(event == TYPE_B){  
  for(Listener l:listeners){  
       l.fireEventB();  
  }  
if(event == TYPE_C){  
  for(Listener l:listeners){  
       l.fireEventC();  
  }  

我想知道这是我能做的最好的还是我应该避免if-else在通知中?我该如何改进呢?

4

2 回答 2

4

您可以准备一个 Map,其中键作为事件类型,值作为侦听器列表,例如 thisL

Map<EventType,List<Listener>> eventListenerMap;

然后使用事件类型键查找侦听器列表并触发相应的侦听器

于 2013-02-27T13:07:14.607 回答
4

如何重构您的解决方案,以便您将是否触发的责任推给侦听器:

类监听器 { 私有 EventType eventType;

   public Listener(EventType eventType) {
       this.eventType = eventType;
   }

   public void fireEvent(EventType eventType) {
       if(this.eventType == eventType) {
          ...do stuff
       }
   }

然后客户端代码如下所示:

..setup...
listeners.add(new Listener(TYPE_A);
listeners.add(new Listener(TYPE_B);
..and so on

然后当你需要触发一个事件时:

for(Listener l:listeners){  
   l.fireEvent(event);  
}  

这是您的选择吗?

于 2013-02-27T13:15:30.537 回答