2011-11-02 57 views
0

我此刻在我的設計模式刷牙,並得到了有點困惑,當我遇到這個教程來了:設計模式混亂

http://www.asp.net/mvc/tutorials/iteration-4-make-the-application-loosely-coupled-cs

如果你看一下清單7起,筆者說,正在使用裝飾者模式。但是,這種模式的主要原則之一是包裝對象和添加責任和行爲?

我認爲它看起來更像和適配器模式,因爲它正在適應MVC特定的ModelStateDictionary以更靈活的IValidationDictionary工作,以便不同的實現可以與服務一起使用(如果使用WPF等)。有新的責任或行爲增加。

我有這個正確與否嗎?如果我錯了,請解釋爲什麼?

感謝

+0

裝飾器將看起來像原始對象,而適配器將採取一個對象,並使它看起來像不同的東西。這裏有很多代碼可供閱讀,但簡而言之,您應該如何區分這些差異。 – Chris

回答

2

我同意你的看法,這看起來對我來說就像Adapter Pattern,也就是說,ModelStateDictionary使用具體類型(適配器),使得執行以後可以修改的界面IValidationDictionary(適配器接口)背後抽象。

Decorator Pattern通常通過合成提供附加功能,展現與裝飾類型相同的界面。這通常通過子分類或通過接口實現完成。

一個裝飾的一個例子是:

  1. 您有從數據庫
  2. 你有一個倉庫裝飾類,能夠緩存對象,而不需要從獲取它們取「物」一庫類數據庫每次。這個裝飾器類通過對原始存儲庫類進行子分類並覆蓋Get()方法來首先檢查該項目的緩存(並且將重寫Save()以更新緩存以及數據庫)來提供緩存獲取和通過合成檢索。
2

我認爲你是正確的,並且有在後的錯誤。從文章:

修飾器模式使您可以包裝一個新的 類中的現有類,以實現一個接口。

這並不完全正確 - 裝飾器允許你在另一個實現中包裝一個實現,但通常不是實現另一個接口,而是用新功能「裝飾」實例。適配器模式允許您採用兩個不同的接口,並將一個實例修改爲與另一個實例相似。

+0

我一般同意你的意見,但我會說,雖然實現裝飾模式的東西可以實現另一個接口,但這不是模式的一部分。所以實際上這個意圖應該永遠不會被裝飾成實現另一個接口的意圖。 – Chris

+0

啊,這是一個很好的觀點:)裝飾師看起來像原來的實現,但會有額外的方法或行爲定義。例如,'ChocolateChipToppingDecorator'裝飾的行爲可能像一個普通的'IceCreamSundae',但提供巧克力片的添加行爲。儘管它們仍然是'IceCreamSundae'類型。在由OP提供的例子中,'ModelStateDictionary'正在纏繞表現得像一個'IValidationDictionary'的一個實例,因此這將是適配器模式。 – matt