2011-11-05 43 views
1

我見過一個CoR模式的示例實現,使用HashMap作爲向下傳遞的對象,可能是由處理程序添加了新內容;下面的代碼的輪廓:HashMap是否在責任鏈中濫用了模式?

class HandlerImpl implements Handler { 

    Handler next; 

    void handle(HashMap context) { 
     // do handler logic, perhaps adding new stuff to "context" 
     if (next != null) 
      next.handle(); 
    } 
} 

人們很容易使用,因爲處理程序可以增強context與可由下列處理程序,而無需重複代碼中使用的新信息。另一方面,處理程序彼此依賴,但它們依然鬆散耦合,但它們的順序變得越來越重要。

這段代碼是否有異味?如果我們發現在沒有用新信息補充上下文對象的情況下我們無法處理CoR模式,那麼在這種情況下使用正確的模式是什麼?

回答

1

我不認爲傳遞一個上下文鏈是違反模式。

servlet過濾器通常用作CoR模式的示例,過濾器可以自由地在共享請求對象上添加/刪除屬性,甚至可以將請求包裝在新對象中,以截獲任何由後續的過濾器或servlet。

2

這取決於你的「處理程序」是什麼意思。一種選擇是將其變成一個「流水線」,它聲明它需要什麼輸入以及它的輸出是什麼。輸出可以是相同的類型 - 可能會修改輸入對象 - 或者可能是一些轉換。這種轉變只會增加信息,或者做一些完全不同的事情。如果只需要添加信息,那麼可以使用合成相當容易地完成。在什麼數據方面

這樣,每個處理器緊耦合(和明確的)它需要/生產 - 但它在什麼都會生產方面鬆耦合消耗數據。

基本上,「最好的辦法」,將取決於:

  • 你正在嘗試做你使用(它有一個不變的推力
  • 什麼語言/平臺,它有什麼靜態打字和泛型?)