定义:动态地给一个对象增长一些附属的职责。ide
装饰装饰,天然的理解就是在原有物品的基础上,增长一些别的东西,让它变得更使人满意。且装饰模式是在不改变对象自己的基础上就行额外的增长,更加灵活。布局
好比买房,首先买的是个空房,随后咱们会放进去家具,和各类生活中要用的东西,让这个家变得更有家的味道,这就是装饰。咱们也没有改变房子的结构。下次,也能够从新对家具进行布局,变成另外的风格this
Component(抽象构件): (空房):具体构件和抽象装饰类的父类,声明了具体构件中的业务方法spa
1 abstract class Component 2 { 3 public abstract void Operation(); 4 }
ConcreteComponent(具体构件类):(刚买的北京二环内的一套房)抽象构件类的子类,用于定义具体的构件对象,实如今抽象构件中声明的方法。装饰类能够为它增长额外职责翻译
1 class ConcreteComponent : Component 2 { 3 public override void Operation() 4 { 5 //功能实现 6 }
Decorator(抽象装饰类):(家具城)抽象构件类的子类,用来给具体构件增长职责3d
1 class Decorator :Component 2 { 3 private Component component;//抽象构件对象的引用 4 5 public Decorator(Component component) 6 { 7 this.component = component; 8 } 9 10 public override void Operation() 11 { 12 component.Operation();//调用原有业务方法 13 } 14 }
ConcreteDecorator(具体装饰类):(桌子 椅子 电器 床.......)抽象装饰类的子类,负责向构件增长新的职责code
1 class ConcreteDecorator :Decorator 2 { 3 public ConcreteDecorator(Component component ):base (component) 4 { 5 } 6 7 public void AddedBehavir() 8 { 9 //新的业务方法 10 } 11 12 public override void Operation() 13 { 14 base.Operation();//调用原有方法 15 AddedBehavir();//调用新的方法 16 } 17 }
现有一家咖啡店,能够根据客户需求提供对应的咖啡。咖啡{ {浓缩咖啡(Espresso),25},{混合咖啡(House Blend),30},{重烘焙咖啡(Dark Roast),20} }component
配料{ {摩卡(Mocha),10} ,{奶泡(Whip),8 },{牛奶 (Milk),6} }对象
输出 浓缩咖啡,摩卡,牛奶 41blog
分析:这就是个混合搭配的状况,只要你有钱,一种咖啡想搭配多少种配料均可以,那咱们算算,3种咖啡,3种配料,一共能够搭配出多少种不一样的饮料呢???不难算出,一种咖啡能够有8种(2^3)搭配,那么3种咖啡共有24种。那么这题写出24种类不就好了。固然是能够的。用继承,也是能够的。可是,因为自由搭配的状况,致使把所有状况写出来是彻底低效的。因此,饮料类能够做为抽象类,配料类做为装饰类,使用装饰模式。咱们想一想,咖啡和配料的搭配,不管是咖啡搭配配料,仍是配料搭配咖啡,效果都是同样的。可是,为了避免影响咖啡类自己,咱们是将配料类关联咖啡类的,即将咖啡类的对象做为本身的成员变量。
Component(抽象构件):Coffee
1 abstract class Coffee//饮料类 2 { 3 public abstract double Cost(); 4 public abstract string Description(); 5 }
ConcreteComponent(具体构件类):浓缩咖啡(Espresso)、混合咖啡(House Blend)、重烘焙咖啡(Dark Roast)
1 class Espresso : Coffee //特浓咖啡(Espresso) vs 滴漏咖啡(Drip) 特浓咖啡的制做原理是让热水在高压下流过一把压得严严实实的细腻的咖啡粉,咖啡因浓度较高,有咖啡脂。 2 { 3 public override double Cost() 4 { 5 return 25; 6 } 7 8 public override string Description() 9 { 10 return "浓缩咖啡"; 11 } 12 } 13 class DarkRoast : Coffee //深培咖啡:按照美式分级,咖啡豆的烘焙由浅至深可分为八个阶段。咖啡的味道主要取决于烘焙度,通常烘焙程度越深苦味越浓,烘焙程度越低,酸味就越高。 14 { 15 public override double Cost() 16 { 17 return 20; 18 } 19 20 public override string Description() 21 { 22 return "深培咖啡"; 23 } 24 } 25 class HouseBlend : Coffee //北美特别流行的黑咖啡,它属于混合咖啡,配方因地而有所不一样,但主要成分都有50%以上的哥伦比亚咖啡豆.能够翻译为家常咖啡。 26 { 27 public override double Cost() 28 { 29 return 30; 30 } 31 public override string Description() 32 { 33 return "混合咖啡"; 34 } 35 }
Decorator(抽象装饰类):Ingredients
1 abstract class Ingredients:Coffee 2 { 3 private Coffee coffee; 4 5 public Ingredients(Coffee beverage) 6 { 7 this.coffee = beverage; 8 } 9 public override double Cost() 10 { 11 return coffee.Cost(); 12 } 13 public override string Description() 14 { 15 return coffee.Description(); 16 } 17 }
ConcreteDecorator(具体装饰类):Mocha、Whip、Milk
1 class Mocha:Ingredients 2 { 3 public Mocha(Coffee beverage):base(beverage ) 4 { 5 } 6 7 public override double Cost() 8 { 9 return base.Cost() + 10; 10 } 11 12 public override string Description() 13 { 14 return base.Description()+",摩卡"; 15 } 16 } 17 18 class Whip : Ingredients //奶泡,由全脂牛奶搅拌而成,可拉丝 19 { 20 public Whip(Coffee beverage) 21 : base(beverage) 22 { 23 } 24 25 public override double Cost() 26 { 27 return base.Cost() + 8; 28 } 29 30 public override string Description() 31 { 32 return base.Description()+",奶泡"; 33 } 34 } 35 36 class Milk : Ingredients //牛奶 37 { 38 public Milk(Coffee beverage) 39 : base(beverage) 40 { 41 } 42 43 public override double Cost() 44 { 45 return base.Cost() + 6; 46 } 47 48 public override string Description() 49 { 50 return base.Description() + ",牛奶"; 51 } 52 }
Progream:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Coffee b = new Espresso(); 6 7 Coffee b1 = new Mocha(b); 8 9 Coffee b2 = new Whip(b1); 10 11 Coffee b3 = new Milk(b2); 12 13 Console.WriteLine("名称:{0}\n价格:{1}",b3.Description (),b3.Cost ()); 14 15 Console.Read(); 16 } 17 }
以上就是装饰模式的介绍,装饰模式的优势是它的扩展比使用继承更灵活,不会使类不少不少。接下来是对关于Coffee的东西,感兴趣的能够看下