2011-10-07 33 views
2

我試圖實現一個簡單的應用程序,讓我選擇在汽車中的演員。 每個額外的項目是一個基類汽車裝飾。如何在C中無序刪除裝飾器#

比方說,我做以下

Car p = new FordFusion(); 
p = new ElectricWindows(p); 
p = new LeatherSeatings(p); 
p = new Airbags(p); 

那麼我的對象則p將是福特Fusion與電動門窗,真皮椅子系列和安全氣囊。

我需要讓用戶刪除裝飾出的順序一樣,比方說,除去電動車窗而不去除皮革椅子系列和安全氣囊

+0

可能重複的[你可以刪除一個裝飾?](http://stackoverflow.com/questions/2166632/can-you-remove-a-decorator) – mellamokb

回答

0

我可能會用Chain of responsibility來解決這個問題。我將創建一個處理程序接口

public interface IAccessoryHandler 
{ 
    bool CanHandle(UserOption option); // UserOption is an enum of Electric Window etc. 

    Handle(Car car); 
} 

然後我想創建處理程序implementaions即ElectricWindowHandler,LeatherHandler等,例如CanHandle()=> if選項== UserOption.electric然後手柄()=> car.Accessories。添加(新ElectricWindow);

每次用戶更改選項時,我都會清除汽車配件系列,對選定的用戶選項進行初步檢查並讓汽車對象通過鏈條運行。在連鎖過程結束後,你的車會有正確的配件。

0

可能有一個集中的對象,告訴你哪個模型哪些功能已被棄用,所以你不必完全改變每個裝飾器模式。只是對它們進行小修改,我的意思是在ElectricWindows返回Car對象之前,它檢查它是否有資格擁有此功能。 希望我有道理!

3

聽起來像裝飾者模式可能不是模型化您的域的最佳方式。你的裝飾者是否真的需要改變汽車的行爲?或者他們只是增加了成本/價格?

你有沒有嘗試過把ICarFeatures集合作爲Car類的成員? ICarFeature可以有一個GetCost方法或類似的東西來增加汽車的總成本。

+1

+1不要認爲裝飾模式是正確的工具。 – mellamokb

0

我的答案假設你不會放棄裝飾者的方法。

在你的問題你規定能夠刪除Decorators故障,這基本上把kibosh建議Undo/RedoDecorate/UnDecorate的方法。

我認爲你可能會利用Memento模式。跟蹤Car的狀態和應用哪個Decorators。通過刪除裝飾器,您基本上遍歷應用的裝飾器堆棧,直到達到所需狀態並將對象恢復到該狀態(先前應用已移除的裝飾器)。然後,您需要重新應用之後執行的裝飾器。可能不是最佳解決方案,但對當前設計影響最小。