大疆 DJI Mini 3 Pro 無人機更多諜照曝光:臂展更長、遙控器配備超大屏
阿新 • • 發佈:2022-04-16
裝飾器模式:就是對已經存在的某些類進行裝飾,以此來擴充套件一些功能。
下面通過現實生活中的一個示例來闡述一下裝飾器模式:
//煎餅的抽象 public abstract class AbstractPancake { /// <summary> /// 煎餅 /// </summary> public abstract string CreatePancake(); /// <summary> /// 價格 /// </summary> public abstract int Cost(); } // 煎餅的具體類 public class Pancake : AbstractPancake { public override int Cost() { return 5; } public override string CreatePancake() { return "山東大煎餅"; } } ///////////配菜(具體的裝飾) /// <summary> /// 加雞蛋 /// </summary> public class AddEgg : AbstractPancake { private AbstractPancake _Pancake = null; public AddEgg(AbstractPancake pancake) { this._Pancake = pancake; } public override int Cost() { return (int)this._Pancake.Cost() + 2; } public override string CreatePancake() { return this._Pancake.CreatePancake() + " 加雞蛋"; } } /// <summary> /// 加火腿腸 /// </summary> public class AddSausage : AbstractPancake { private AbstractPancake _Pancake = null; public AddSausage(AbstractPancake pancake) { this._Pancake = pancake; } public override int Cost() { return (int)this._Pancake.Cost() + 3; } public override string CreatePancake() { return this._Pancake.CreatePancake() + " 加火腿腸"; } } //顧客 public class Customer { public string Name { get; set; } public Customer(string name) { Name = name; } public void Buy(AbstractPancake pancake) { Console.WriteLine($"{Name} 購買了:{pancake.CreatePancake()} 一份,花費:{pancake.Cost()} 元!"); } } internal class Program { static void Main(string[] args) { //張三,要一個原味的煎餅 Customer customer1 = new Customer("張三"); AbstractPancake pancake = new Pancake(); customer1.Buy(pancake); Console.WriteLine("***********************"); //加雞蛋 加火腿腸 Customer customer2 = new Customer("譚勇君"); AbstractPancake pancake1 = new Pancake(); pancake1 = new AddEgg(pancake1); pancake1 = new AddSausage(pancake1); customer2.Buy(pancake1); Console.ReadKey(); } }
上面的程式碼以煎餅為主體,用配菜來“裝飾”煎餅,然後根據每個顧客的需求進行裝飾煎餅。
通過上面的示例可以發現裝飾器模式有以下優點:
1.裝飾類和被裝飾類可以獨立發展,而不會相互耦合。例如:AbstractPancake類無須知道裝飾類(AddEgg、AddSausage),裝飾類是從外部來擴充套件AbstractPancake類的功能,而裝飾類也不用知道具體的細節。
2.裝飾模式是繼承關係的一個替代方案,裝飾類不管裝飾多少層,他始終是一個抽象類實現的,所以他是繼承的一種良好替代方案。
裝飾器模式雖然從數量級上減少了類的數量,但是為了要裝飾,仍舊會增加很多的小類,這些具體的裝飾類的邏輯將不會非常的清晰,不夠直觀,容易令人迷惑。還就是裝飾器模式雖然減少了類的爆炸,但是在使用的時候,你就可能需要更多的物件來表示繼承關係中的一個物件,多層的裝飾是比較複雜,比如查詢問題時,被層層巢狀,不容易發現問題所在。