设计模式第三集——装饰者模式(Decorator)
再次強調設計的重要原則:對擴展開放,對修改關閉。在設計中要盡量避免對之前源代碼的修改。
為適應擴展的特性,除了繼承之外,還可以用裝飾者模式:動態的將新的功能附加到對象上。換句話說,裝飾者模式就是有一群裝飾者類,這些類包裹起具體的組件。在java中,最典型的裝飾者模式就是java I/O
?
?FileInputStream是被包裝的組件,有最基本的讀取字節的功能。BufferInputStream是一個具體的裝飾者,它加入了兩種新的行為:readLine()和緩沖輸入;LineNumberInputstream也是一個具體的裝飾者它在BufferInputStream之上又加入了計算行數的功能。
具體例子:咖啡館訂單系統。咖啡館有多款咖啡,例如HouseBllend、DarkRoast;顧客在購買咖啡時經常要求在咖啡中加上各種調料例如Streamed Milk,Mocha。根據客戶不同的要求收取不同的費用。
UML圖:調料類CondimentDecortor是飲料類Beverage的裝飾類。在裝飾類的兩種調料中,有一個實例變量Beverage,用它來記錄需要包裹的實例。注意:最終的結果是經過裝飾類包裝之后的類,也就是說裝飾類可以取代Beverage,所以裝飾類CondimentDecortor必須繼承自Beverage
飲料?Beverage
1 package com.coffee; 2 3 public abstract class Beverage { 4 protected String description="Unknown Beverage"; 5 protected int Size;//1:小杯 2:中杯 3:大杯 6 7 public String getDescription() { 8 return description; 9 } 10 11 public int getSize() { 12 return Size; 13 } 14 15 public abstract double cost();//cost在子類中實現 16 17 18 }HouseBlend咖啡具體實現飲料類
1 package com.coffee; 2 3 public class HouseBlend extends Beverage{ 4 public HouseBlend(int size) { 5 description="HouseBlend"; 6 Size=size; 7 if(getSize()==1){ 8 description+="Small"; 9 }else if(getSize()==2){ 10 description+="Middle"; 11 }else if(getSize()==3){ 12 description+="Large"; 13 } 14 } 15 16 public double cost() { 17 double Cost=1.99; 18 if(getSize()==1){ 19 Cost+=1.0; 20 }else if(getSize()==2){ 21 Cost+=2.0; 22 }else if(getSize()==3){ 23 Cost+=3.0; 24 } 25 return Cost; 26 } 27 28 }調料裝飾類CondimentDecorator
1 package com.condiment; 2 3 import com.coffee.Beverage; 4 5 public abstract class CondimentDecorator extends Beverage { 6 public abstract String getDescription(); 7 public abstract int getSize(); 8 9 }Mocha調料實現CondimentDecorator
1 package com.condiment; 2 3 import com.coffee.Beverage; 4 5 public class Mocha extends CondimentDecorator{ 6 Beverage beverage; 7 8 public Mocha(Beverage beverage) { 9 this.beverage = beverage; 10 } 11 12 public int getSize(){ 13 return Size; 14 } 15 16 public String getDescription() { 17 // TODO Auto-generated method stub 18 String order="Order:"; 19 if(getSize()==1){ 20 order+="Small"; 21 }else if(getSize()==2){ 22 order+="Middle"; 23 }else if(getSize()==3){ 24 order+="Large"; 25 } 26 return order+beverage.getDescription()+",Mocha"; 27 } 28 29 30 public double cost() { 31 // TODO Auto-generated method stub 32 double cost=beverage.cost()+.20;//取得之前飲料的加個加上摩卡的加個.20 33 if(getSize()==1){ 34 cost+=1.0; 35 }else if(getSize()==2){ 36 cost+=2.0; 37 }else if(getSize()==3){ 38 cost+=3.0; 39 } 40 return cost; 41 } 42 43 }?
轉載于:https://www.cnblogs.com/doublesong/archive/2012/07/30/2614984.html
總結
以上是生活随笔為你收集整理的设计模式第三集——装饰者模式(Decorator)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】不带www跳转www.设定网站唯
- 下一篇: asp.net ajax控件工具集 Au