看到别人写的,都看不进去,算了还是自己手写一遍吧,算是帮助自己理解了。写的比较简单,例子也比较好懂,什么时候使用自己看着办。
1.定义
装饰者模式:动态地将职责附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案。
装饰者和被装饰者对象都哟相同的超类。
装饰者会使程序中出现很多小类,增加使用难度
可以透明的插入装饰者,客户都不知道是和装饰者打交道
2:使用场景
对象由主体+许多可选的部件或者功能构成,使用继承或者接口会产生很多类,且很难扩展。
例如,现在需要一杯饮料,主体是水,可以选择添加甜味、咸等其他味道,这种情况下就可以使用装饰者模式。
3:代码实现
基类,抽象类
public abstract class Drink { public string DrinkName = ""; //直接打印出名称 public void PrintName() { Console.WriteLine(DrinkName); } public abstract double Cost(); }
被装饰者,水。也可以是茶和其他的饮料
public class Water : Drink { public Water() { DrinkName = "水"; } public override double Cost() { return 2; } }
装饰者,加糖,盐等
/// <summary> /// 甜味,每份2元,有点贵额 /// </summary> public class Sweet:Drink { private Drink BaseDrink; public Sweet(Drink drink) { BaseDrink = drink; DrinkName = " 加糖"+BaseDrink.DrinkName; } public override double Cost() { return BaseDrink.Cost()+2; } }
/// <summary> /// 加盐 /// </summary> public class Salt : Drink { private Drink BaseDrink; public Salt(Drink drink) { BaseDrink = drink; DrinkName = " 加盐"+BaseDrink.DrinkName ; } public override double Cost() { return BaseDrink.Cost() + 1; } }
老板来一份 加一份盐,2份甜味的水,这个味道重口味额
static void Main(string[] args) { Drink OrderDrink = new Water(); OrderDrink = new Sweet(OrderDrink); OrderDrink = new Sweet(OrderDrink); OrderDrink = new Salt(OrderDrink); OrderDrink.PrintName(); Console.WriteLine("您所需的价钱为:"+OrderDrink.Cost()); Console.ReadKey(); }
好了,饮料来了,付钱吧!骚年...