一樣翻自 java , 這裡最大重點就是 new
出物件的時候不要用 var
, 要明確指明 Beverage
不然就發揮不出他寫很爽的裝飾感
實務上自己是沒這樣寫過 , 看老外是包 log 可以看這篇
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
| //這裡不要用 var 要明確給 Beverage 型別不然會有問題 Beverage espresso = new Espresso(); Console.WriteLine(espresso.Description); Console.WriteLine(espresso.Cost()); Console.WriteLine();
//加牛奶 espresso = new Milk(espresso); Console.WriteLine(espresso.Description); Console.WriteLine(espresso.Cost()); Console.WriteLine();
//雙倍牛奶 espresso = new Milk(espresso); Console.WriteLine(espresso.Description); Console.WriteLine(espresso.Cost()); Console.WriteLine();
//加奶油 espresso = new Whip(espresso); Console.WriteLine(espresso.Description); Console.WriteLine(espresso.Cost());
//Component abstract class Beverage { public virtual string Description { get; set; } = "Unknown beverage";
public virtual double Cost() { return 0; }
public virtual void Style() { Console.WriteLine("this is a taiwanese style coffee"); } }
class Decaf : Beverage { public Decaf() { Description = "Decaf"; } public override double Cost() { return 125; } }
class HouseBlend : Beverage { public HouseBlend() { Description = "HouseBlend"; } public override double Cost() { return 300; } }
class Espresso : Beverage { public Espresso() { Description = "Espresso"; } public override double Cost() { return 150; }
}
class DarkRoast : Beverage { public DarkRoast() { Description = "DarkRoast"; } public override double Cost() { return 250; } }
//調味料 class CondimentDecorator : Beverage { protected Beverage Beverage; public override string Description { get => base.Description; set => base.Description = value; } }
class Milk : CondimentDecorator { public Milk(Beverage beverage) { this.Beverage = beverage; }
public override double Cost() { return this.Beverage.Cost() + 75; }
public override string Description { get => this.Beverage.Description + " Milk"; set => base.Description = value; } }
class Whip : CondimentDecorator { public Whip(Beverage beverage) { this.Beverage = beverage; }
public override double Cost() { return this.Beverage.Cost() + 15; }
public override string Description { get => this.Beverage.Description + " Whip"; set => base.Description = value; } }
class Soy : CondimentDecorator { public Soy(Beverage beverage) { this.Beverage = beverage; }
public override double Cost() { return this.Beverage.Cost() + 25; }
public override string Description { get => this.Beverage.Description + " Soy"; set => base.Description = value; } }
class Mocha : CondimentDecorator { public Mocha(Beverage beverage) { this.Beverage = beverage; }
public override double Cost() { return this.Beverage.Cost() + 50; }
public override string Description { get => this.Beverage.Description + " Mocha"; set => base.Description = value; }
public override void Style() { base.Style(); Console.WriteLine("Also, it has italian style..."); } }
|