從「頭先:設計模式」書中的裝飾模式用例使我有這個問題。我會盡力把它寫下來:使用列表而不是裝飾模式?
這是一個咖啡廳系統與一些咖啡和大量的調味品 你可以把它們(需支付額外費用),你需要能夠訂購 和爲了避免產生總的混亂(例如布爾值來追蹤 調味品),使用Decorator Pattern來裝飾任何調味品的咖啡。我們有一個抽象的飲料 類,每種類型的咖啡,混凝土構件和各調味品 混凝土裝飾包裹起來的飲料,如:
因此,我們有以下過程返回咖啡成本:
我的問題是:爲什麼不使用列表,而不是裝飾實現這個?我們可以在每個飲料中列出調味品列表,並通過遍歷列表來計算成本。要訂購的咖啡,我們就只需要一次實例並添加所需的調味品,避免類似的聲明:
// Using second image example
Beverage beverage = new DarkRoast(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
此外,我們將有想放棄的折扣,咖啡不包括它的調味品操作更加靈活,一旦我們不會讓裝飾者包裝咖啡。這是一個長期研究的問題,我知道我錯過了一些東西,或者我錯了,所以如果你對此有任何想法,我很想知道並進一步討論它。
這不是關於折扣或稅款清單,您必須扣除或按成本添加。這是關於您使用裝飾模式處理的行爲。而且,相信我,用列表而不是繼承來處理這些行爲是很困難的。 – freedev
你能用這個案例舉個例子嗎?或者可能是另一個隨機情況我真的無法想象發生這種情況的情況。 – Paternostro
這似乎是一個更好的[softwareengineering.stackexchange.com](https://softwareengineering.stackexchange.com)的問題。就我個人而言,我認爲這是Decorator的一個可怕的用法(維基百科也有類似的例子,我認爲),絕對可以用一個更易於管理的方式用列表解決。 'java.io.InputStream'是裝飾器的一個例子,它運行良好。但是,您已經可以看到有一位用戶不同意我的觀點,這就是爲什麼這可能與SO無關。 – Radiodef