定義:動態地給一個對象增長一些附屬的職責。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的東西,感興趣的能夠看下