装饰器模式是一个结构型设计模式
模式类图
实例类图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 interface IHumburger 2 { 3 double GetPrice(); 4 string Name { get; } 5 } 6 7 class ChickenHumbuger : IHumburger 8 { 9 public double GetPrice() 10 { 11 return 10; 12 } 13 14 public string Name 15 { 16 get { return "鸡肉堡"; } 17 } 18 } 19 20 class PorkHumbuger : IHumburger 21 { 22 public double GetPrice() 23 { 24 return 12; 25 } 26 27 public string Name 28 { 29 get { return "手撕猪肉堡"; } 30 } 31 } 32 33 abstract class Condiment : IHumburger 34 { 35 protected IHumburger Humburger; 36 37 protected Condiment(IHumburger humburger) 38 { 39 Humburger = humburger; 40 41 } 42 43 protected abstract double GetCondimentPrice(); 44 protected abstract string GetCondimentName(); 45 46 public double GetPrice() 47 { 48 return Humburger.GetPrice() + GetCondimentPrice(); 49 } 50 51 public string Name 52 { 53 get { return Humburger.Name + "加" + GetCondimentName(); } 54 } 55 } 56 57 class Chilli : Condiment 58 { 59 public Chilli(IHumburger humburger) 60 : base(humburger) 61 { 62 } 63 64 protected override double GetCondimentPrice() 65 { 66 return 1; 67 } 68 69 protected override string GetCondimentName() 70 { 71 return "辣椒"; 72 } 73 } 74 75 class Lettuce : Condiment 76 { 77 public Lettuce(IHumburger humburger) 78 : base(humburger) 79 { 80 } 81 82 protected override double GetCondimentPrice() 83 { 84 return 1.5; 85 } 86 87 protected override string GetCondimentName() 88 { 89 return "生菜"; 90 } 91 } 92 93 class Cheese : Condiment 94 { 95 public Cheese(IHumburger humburger) 96 : base(humburger) 97 { 98 } 99 100 protected override double GetCondimentPrice() 101 { 102 return 2; 103 } 104 105 protected override string GetCondimentName() 106 { 107 return "芝士"; 108 } 109 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 6 PrintMenu(); 7 IHumburger humburger = new ChickenHumbuger(); 8 ConsoleKey key = ConsoleKey.A; 9 while (key != ConsoleKey.Escape) 10 { 11 key = Console.ReadKey(false).Key; 12 switch (key) 13 { 14 case ConsoleKey.C: 15 humburger = new ChickenHumbuger(); 16 break; 17 case ConsoleKey.P: 18 humburger = new PorkHumbuger(); 19 break; 20 case ConsoleKey.D1: 21 case ConsoleKey.NumPad1: 22 humburger = new Lettuce(humburger); 23 break; 24 case ConsoleKey.D2: 25 case ConsoleKey.NumPad2: 26 humburger = new Chilli(humburger); 27 break; 28 case ConsoleKey.D3: 29 case ConsoleKey.NumPad3: 30 humburger = new Cheese(humburger); 31 break; 32 default: 33 Console.WriteLine("没有此选项"); 34 break; 35 } 36 PrintDetail(humburger); 37 } 38 Console.ReadLine(); 39 } 40 41 private static void PrintMenu() 42 { 43 Console.WriteLine("C.鸡肉堡"); 44 Console.WriteLine("P.手撕猪肉堡"); 45 Console.WriteLine("1.生菜"); 46 Console.WriteLine("2.辣椒"); 47 Console.WriteLine("3."); 48 Console.WriteLine("Esc.点餐完成"); 49 } 50 51 private static void PrintDetail(IHumburger humburger) 52 { 53 Console.WriteLine("汉堡名称:" + humburger.Name + " " + "总价:" + humburger.GetPrice()); 54 Console.WriteLine("---------------------------------------------"); 55 } 56 }