2013-02-27 67 views
2

我有一个可观察的(来自观察者/可观察模式),有一个已注册监听者列表。
当一个事件发生的通知代码所做的:如何避免在observable的通知中出现if/else?

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?我怎么能改善这个?

+0

'switch'?或者你在想什么? – nfechner 2013-02-27 13:06:26

+0

@nfechner:不是'switch'。或许观察者应该是“破”? – Jim 2013-02-27 13:07:09

回答

4

如何寻找听众列表重构您的解决方案,以便将您的责任推给听众:

class Listener { private 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); 
} 

这是一个选择?

4

您可以用键事件类型和值作为听众的名单准备地图,像thisL

Map<EventType,List<Listener>> eventListenerMap; 

然后使用事件类型的密钥和火相应的听众

+0

有趣,但这意味着每个监听器必须实现3个接口,对吗?因此,它使客户端(观察者)的事情变得复杂。 – Jim 2013-02-27 13:11:35

+0

只有一个额外的'fireEvent'方法 – Apurv 2013-02-27 13:12:58

+0

为什么1?我已经有3个事件 – Jim 2013-02-27 13:16:59

相关问题