2011-06-21 110 views
6

我想了解用於處理一系列消息的最適合的(Java)設計模式。每條消息都包含一個「類型」,用於確定應如何處理消息中包含的數據。處理事件的設計模式

我一直在考慮命令模式,但正在努力理解特定命令類的角色/相關性。到目前爲止,我已經確定接收器將包含實現消息處理方法的代碼。具體命令將根據消息類型進行實例化。但是,我不知道應該如何傳遞實際的消息數據。是否應該通過具體的命令execute方法調用適當的接收方法傳遞給接收方構造函數?也許消息數據應該在接收者操作方法調用中傳遞?

我對這一切都是相當新的,所以任何指導將不勝感激。

這可能會幫助:

public interface Command { 
    public void execute(String msg); 
} 

public class AO1Command implements Command { 

    Receiver rec = new Receiver(); 

    public void execute(String msg) { 
     rec.admit(msg); 
    } 
} 

public class CommandFactory { 

    public protected CommandFactory() { } 

    public static Command getInstance(String type) { 

     if (type.equals("A01")) return new A01Command(); 
     else if (type.equals("A02")) return new A02Command(); 
     else { 
      return null; 
     } 
} 
+0

只是一個小方面的說明。切勿使用運算符進行相等(==)來比較字符串。取決於jvm實現「hello」==「hello」可能評估爲false。這是因爲==運算符使用對象標識,這意味着只有當兩個對象相同時它才爲真。 「hello」==「hello」實際上可能會構造兩個字符串對象 - >不完全相同。用equals()方法代替 – bennidi

+0

@bennidi:謝謝你。我編輯了這個例子 - 並檢查了原始代碼:) – skyman

回答

3

好了,你的標題說,對處理事件的模式。如果你正在談論一個實際的事件框架,那麼就會想到Observer/Observable模式。當你想要觸發某種類型的事件時,這會起作用,然後讓事件處理程序處理事件的處理。

似乎你的問題是在命令模式的實現細節。你可以發佈一些代碼,顯示你被卡住的地方嗎?

請注意,模式並不相互排斥,您可以在Observable模式的上下文中使用命令模式。

編輯 - 根據您的代碼,你應該

1)使CommandFactory靜態的。
2)將該類型傳遞給getCommand方法,該方法也應該是靜態的。
3)你並不需要爲這個反射,你可以簡單地做

if (type == "type1") return new Command1(); 
else if (type == "type2") return new Command2(); 
... 

我不是說你不能使用反射,我說了什麼過分複雜,你正在嘗試做的。另外,它們的方式就是將表示消息類型的字符串綁定到命令類名稱的實現細節,這似乎沒有必要。

+0

你可以在此擴展嗎?觀察者可以用來收集要處理的消息,例如,如果它們是通過單擊Swing GUI組件生成的,但Command模式似乎與實際處理消息更相關。 – Ben

+0

@Ben是更多即將到來 – hvgotcodes

+0

謝謝你的所有意見。我一直在進一步研究 - 解釋我正在處理的信息是HL7(健康語言7)。這並不重要,但結構是相似的 - 只有所需的行動是不同的。所以A01是「耐心承認」,而A02是「患者轉移」。關鍵是每條消息都有一個類型(A01,A02等)。所以通過建議工作: – skyman

1

您正處在正確的軌道上。命令模式是對概述問題的適當解決方案。

要回答你的問題,你應該讓你的CommandFactory實例化一個基於數據差異的適當的Command實例(在這裏是你的消息中的一些數據)。然後你會在Command實例上調用一個方法,傳遞你的消息。調用此方法執行(...)是常見的(最佳)做法,但您可以隨意調用它。

+0

我試圖用上面加載的示例代碼來做到這一點。在我看過的一些例子中,實現命令的實際代碼封裝在Command接收方法中,以便命令execute方法只是調用receiver.admit()。這意味着(我認爲)該消息將由接收方而不是命令保存?道歉,如果我在這裏混淆事情.... – skyman

0

您可能想看看Jakarta Digester項目(處理XML),它有一個SAX實現,這是一個基於事件的API,這裏解釋爲http://www.saxproject.org/event.html,這是一個簡短的解釋,但可以作爲一個起點爲你。