設計模式學習--裝飾者模式(Decorator Pattern)
阿新 • • 發佈:2022-05-02
概念:
裝飾者模式(Decorator Pattern): 動態地將功能新增到物件,相比生成子類更靈活,更富有彈性.
解決方案:
裝飾者模式的重點是物件的型別,裝飾者物件必須有著相同的介面,也也就是有著相同的結構.這樣一來,在執行的過程中,就可以將這些物件融合在一起,將相同的屬性等成員有機的結合,就像生成另外一種型別一樣,而實際上,我們並不需要真的建立這個型別,它是動態生成的.這些裝飾者既可以組合,也可以撤銷組合,既回覆到原來物件狀態.
示例介紹:
裝飾者模式的關鍵就是裝飾者型別的定義,而其中應包括組合操作的方法.
現在我們看一下裝飾者介面的定義:
/// <summary> /// 裝飾者模式模型,介面 /// </summary> public interface IDecorator { string Name { get; } int Sum { get; } void Add(IDecorator decorator); }
接下來是裝飾者類CDecorator類的定義:
/// <summary> /// 裝飾者類 /// </summary> public class CDecorator:IDecorator { private string myName; private int mySum; private ArrayList myDecorator; public CDecorator() { myName = ""; mySum = 0; myDecorator = new ArrayList(); } //只讀屬性,名稱 public string Name { get { string result = myName; foreach (IDecorator d in myDecorator) { result += ", " + d.Name; } return myName; } } //只讀屬性,合計值 public int Sum { get { int result = mySum; foreach (IDecorator d in myDecorator) { result += d.Sum; } return mySum; } } //新增裝飾者物件 public void Add(IDecorator decorator) { myDecorator.Add(decorator); } }
下面我們通過程式碼測試下這個模型:
//應用測試 class Program { static void Main(string[] args) { CDecorator decoratorA = new CDecorator("decoratorA", 1); CDecorator decoratorB = new CDecorator("decoratorB", 2); CDecorator decoratorC = new CDecorator("decoratorC", 3); decoratorA.Add(decoratorB); decoratorA.Add(decoratorC); Console.WriteLine(decoratorA.Name); Console.WriteLine(decoratorA.Sum); Console.Read(); } }
執行結果如下:
應用特點
使用裝飾者模式時應注意以下特點:
- 因裝飾者模式一般用於動態組合物件,所以,他們一般都是臨時性的,在這個模型中,我們並沒有新增取消組合功能.如果需要,你可以在IDecorator介面中新增Remove()方法,並在CDecorator類中實現它.
- 不需要建立新的型別,就可以修改物件的特性(如物件的各種屬性值),從而影響了物件的行為,就像建立了一個新的物件型別一樣.
- 需要建立很多的相同結構的裝飾者物件,以便於組合.
結束語
不要強硬的去理解設計模式,也不要強硬的去套用它的形式,你所要做的是理解它的技巧以及思想,慢慢體會你才會理解它的妙用,這是我的一點體會,希望大神多多拍磚.如果感覺不錯,請推薦****