裝飾模式概述 定義:動態地給一個對象增加一些附屬的職責。 裝飾裝飾,自然的理解就是在原有物品的基礎上,增加一些別的東西,讓它變得更令人滿意。且裝飾模式是在不改變對象本身的基礎上就行額外的增加,更加靈活。 比如買房,首先買的是個空房,隨後我們會放進去傢具,和各種生活中要用的東西,讓這個家變得更有家的味 ...
- 裝飾模式概述
定義:動態地給一個對象增加一些附屬的職責。
裝飾裝飾,自然的理解就是在原有物品的基礎上,增加一些別的東西,讓它變得更令人滿意。且裝飾模式是在不改變對象本身的基礎上就行額外的增加,更加靈活。
比如買房,首先買的是個空房,隨後我們會放進去傢具,和各種生活中要用的東西,讓這個家變得更有家的味道,這就是裝飾。我們也沒有改變房子的結構。下次,也可以重新對傢具進行佈局,變成另外的風格
- 裝飾模式的結構和實現
Component(抽象構件): (空房):具體構件和抽象裝飾類的父類,聲明瞭具體構件中的業務方法
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(抽象裝飾類):(傢具城)抽象構件類的子類,用來給具體構件增加職責
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(具體裝飾類):(桌子 椅子 電器 床.......)抽象裝飾類的子類,負責向構件增加新的職責
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} }
配料{ {摩卡(Mocha),10} ,{奶泡(Whip),8 },{牛奶 (Milk),6} }
輸出 濃縮咖啡,摩卡,牛奶 41
分析:這就是個混合搭配的情況,只要你有錢,一種咖啡想搭配多少種配料都可以,那我們算算,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 }View Code
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 }View Code
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 }View Code
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 }View Code
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 }View Code
以上就是裝飾模式的介紹,裝飾模式的優點是它的擴展比使用繼承更靈活,不會使類很多很多。接下來是對關於Coffee的東西,感興趣的可以看下