2009-11-14 20 views
4

例如,假設我有一個可添加到購物車的產品類。當它也在購物車中時,我可能希望能夠將其與另一件物品一起打包並添加15%的折扣。何時適合爲某個對象創建裝飾器,以及何時適當重寫對象以允許應用策略?

產品類是否應該使用允許交易的新子類進行修飾,或者是否應重新設計產品類以允許購物車將降價「策略」對象附加到產品,從而降低產品價格?

這是一個抽象的例子,所以把它放在你想要的地方。

回答

3

裝飾者是您可以應用的侵入性最小的模式之一 - 當您這樣做時,您遵循開放/封閉原則,因爲您的原始類別從未被修改過。我傾向於儘可能使用裝飾器。當原始類不需要與擴展進行交互時,情況大多如此。

注入策略更具侵入性,因爲獲得策略的班級必須修改爲接受策略(顯然,一旦您進行此修改,您可以應用很多不同的策略,而無需進一步修改班級)。當原始類需要與策略進行交互時(例如,詢問某件事情),我使用策略。

注意策略往往可以裝飾...

+0

你用了一個詞在這裏,我要包括在我的回答中:「注射」。我傾向於將注射和策略放在一起。我傾向於將Decorating作爲對現有功能的補充,並且當我的'child.SomeMethod()'方法調用'base.SomeMethod()'' –

+0

'時,我傾向於使用裝飾器。因此,使用這個人造的例子,你會說讓購物車「認可」這筆交易會更合適,將購物車中的產品包裝在「折扣產品」裝飾類中? – Zak

+0

正如所寫,是的。實際上,當涉及到產品和購物車時,您可能想知道原始價格以及折扣價格,以便能夠報告節省的金額,在這種情況下,該例子會分崩離析。 –

0

只看你的域名。

如果是允許降價的產品(嗯......我不這麼認爲),那麼您應該將其添加到產品中。 如果它是訂單(imo,正確的地方做折扣),那麼它應該在那裏。

+0

但在購物車項目是不是命令,並應有/顯示折扣在適當的時候.. – Zak

相關問題