设计模式之装饰器模式

装饰器模式是一个结构型设计模式

模式类图

实例类图

  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     }
View Code
 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     }
客户端调用代码
原文地址:https://www.cnblogs.com/XzcBlog/p/5197976.html