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

ソリューションをリファクタリングして、リスナーに発砲するかどうかの責任をプッシュするのはどうですか。

クラスリスナー{プライベートEventTypeeventType;

   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 に答える
4

次のように、キーをイベント タイプとして、値をリスナーのリストとしてマップを準備できます。

Map<EventType,List<Listener>> eventListenerMap;

次に、イベント タイプ キーを使用してリスナー リストを探し、対応するリスナーを起動します。

于 2013-02-27T13:07:14.607 に答える