2016-02-20 32 views
0

目前我有一個使用隊列事件的方法。基於類型我調用適當的方法來處理它。強制使用隊列的模式

private void consumeQueue() { 
    MyQueue myQueue = MyQueue.getInstance(); 
    Iterator mIterator = myQueue.iterator(); 
    while (mIterator.hasNext()) { 

     Object mEvent = null; 
     try { 
      mEvent = mIterator.next(); 
      mIterator.remove(); 
     } catch (NoSuchElementException e) { 
      return; 
     } 

     if (mEvent instanceof EventOne) 
      handleOne((EventOne) mEvent); 
     else if (mEvent instanceof EventTwo) 
      handleTwo((EventTwo) mEvent); 
     ... 
    } 
} 

讓我們假設開發者在其他地方排隊一個新類型的事件,我們稱之爲EventThree。這樣做,我不能確定開發人員將正確處理EventThree的消費。

是否有任何模式,所以我可以強制(在編譯時)開發人員來處理EventThree的消耗?

+1

更好的方法是強制每個「事件」具有「句柄」方法。 – qqilihq

+2

簡單多態(mEvent.handle()')或訪問者模式(https://en.wikipedia.org/wiki/Visitor_pattern) –

+0

這意味着我需要強制開發者擴展事件基類,它正在實現與handle()裏面的接口?但那麼,我該如何強制他延長賽事? – MoreOver

回答

0

據我瞭解您的MyQueue類實現Queue interfance。你永遠不要在你的代碼中使用raw types。請考慮使用MyQueue作爲一個通用類與某些類型參數:

MyQueue<EventOne> myQueue = MyQueue.getInstance(); 

OFC你就必須改變getInstance()方法了。優雅的解決方案可能如下所示:

<T> MyQueue<T> getInstance(Class<T> clazz) { 
    if (clazz == EventOne.class) { 
     // ... 
    } else if (clazz == EventTwo.class) { 
     // ... 
    } 
} 

P.S.不幸的是,由於Java的type erasure,所以不能定義兩個getInstance()方法與不同的Queue類型參數。

+0

這是真的,即使不涉及問題,謝謝。 – MoreOver