[c#] 裝飾器模式與繼承的例子


Answers

想像一下像“文明”這樣的遊戲,地圖上的每個方格都可以附加各種資源(例如,各種礦石,木材或石油等)。

如果使用直接繼承,則需要為每種方塊創建一個類。 擁有它是笨拙的

public class OilSquare {}
public class OilAndGoldSquare {}
public class GoldAndSilverSquare {}
// etc.

裝飾器模式允許混合和匹配,而無需創建嚴格的層次結構。 所以,你有:

public class Square {}
public class GoldDec {}
public class SilverDec {}
public class OilDec {}

// ...

var crazyMix = new GoldDec(new SilverDec(new OilDec(new Square())));

換句話說,裝飾器允許創建管道行為,管道中的每個步驟都可以與另一個步驟交換。

Question

我一直在嘗試使用裝飾器模式來擴展你不想觸摸的代碼的功能,我看到瞭如何實現它但是我現在不確定你為什麼不繼承原始類並擴展那種方式。

我已經讀過裝飾器模式允許您在運行時添加功能,而繼承意味著它在編譯時。

我不明白這一點。

有人可以解釋一下,提供示例並解釋何時使用裝飾器與繼承更好。

謝謝




如果要添加許多功能並且還需要組合這些功能,裝飾器模式優於繼承。 假設您的基類是A,並且您希望使用特徵f1,f2,f3,f4以及它們的某些組合(如(f1,f2)和(f1,f3)和...)擴展(修飾)此基類。 因此,您需要在層次結構中創建4!= 4 * 3 * 2 * 1 = 24類(每個功能4個,其餘為組合)。 而使用裝飾圖案,你只需要創建4個類!

@Razvi中的@Seyed Morteza Mousavi帖子:你是對的,我們可以向View類添加兩個屬性Scrollable和Bordered,然後檢查屬性是否設置為true,以便運行所需的行為。 但這需要我們已經知道我們需要的功能的數量(在裝飾器模式中不是這種情況)。 否則,對於我們想要添加到我們的類的每個新特性(比如f1),我們需要改變我們的主類,或者繼承主類(你會說)並添加屬性。 採用後一種方法,你還需要改變處理特徵組合的代碼部分(這不好,因為它不符合“鬆散耦合!”的經驗法則)

希望這可以幫助。




Related