head first-----decorate design pattern

淺談設計模式之------裝飾者模式
    首先給出裝飾者模式的定義吧:
             動態的將責任附加到對象上,如果要擴展功能,裝飾者提供了比繼承更加具備彈性的替代方案。
    其中,裝飾者模式秉承着一個原則:對外擴展開放,對修改關閉。、
    下面以一個例子爲實例來增強對此模式的理解      如下是星巴克咖啡生產咖啡爲例,定義一個Beverage abstract class 用於表示飲料的總稱,裏面包括兩個方法getDescription()、cost()。定義一個裝飾組件CondimentDecorate CoComponent,其主要是用來調料裝飾的。其繼承Beverage抽象類。定義四中咖啡類型:DarkRoast、Decaf、Espresso、HouseBlend。四個裝飾調料對象:Milk、Mocha、Soy、Whip。其中調料組件和具體的調料組件具備相同的超類屬性。咱們能夠在類動態的運行的時候再根據客戶的需求加入相應的調料,從而能夠生產各類各樣的咖啡飲料。     如下是具體代碼實現: package com.clark.decoratepattern.abstractclass; /**  * 定義一個飲料抽象類  * @author Administrator  *  */ public abstract  class Beverage {     public String description="Unknown Beverage";     public String getDescription(){         return description;     }     public abstract double cost(); } package com.clark.decoratepattern.abstractclass; /**  * 調料抽象類,用於裝飾飲料  * 其應該和被裝飾的類具備相同的超類  * @author Administrator  * 全部的裝飾者類也即調料者都必須從新實現getDescription()方法  */ public abstract class CondimentDecorate extends Beverage {     public abstract String getDescription(); } package com.clark.decoratepattern; import com.clark.decoratepattern.abstractclass.Beverage; /**  * 綜合咖啡類  * @author Administrator  *  */ public class HouseBlend extends Beverage {     public double cost() {         return 0.89;     }     public HouseBlend(){         description="House Blend Coffee";     } } package com.clark.decoratepattern; import com.clark.decoratepattern.abstractclass.Beverage; /**  * 濃縮咖啡類  * @author Administrator  *  */ public class Espresso extends Beverage {     //屬性繼承自父類     public Espresso(){         description="Espresso";     }     public double cost() {         return 1.99;     } } package com.clark.decoratepattern; import com.clark.decoratepattern.abstractclass.Beverage; /**  * 低咖啡因  * @author Administrator  *  */ public class Decaf extends Beverage {     public double cost() {         return 1.05;     }     public Decaf(){         description="decaf";     } } package com.clark.decoratepattern; import com.clark.decoratepattern.abstractclass.Beverage; /**  * 深度烘焙咖啡  * @author Administrator  *  */ public class DarkRoast extends Beverage{          @Override     public double cost() {         return 0.99;     }     public DarkRoast(){         description="dark roast coffee";     } } package com.clark.decoratepattern.decorate; import com.clark.decoratepattern.abstractclass.Beverage; import com.clark.decoratepattern.abstractclass.CondimentDecorate; /**  * 奶泡Whip調料裝飾對象  * @author Administrator  *  */ public class Milk extends CondimentDecorate {     Beverage beverage;     public Milk(Beverage beverage){         this.beverage=beverage;     }     @Override     public String getDescription() {         return this.beverage.getDescription()+",Milk";     }     @Override     public double cost() {         return this.beverage.cost()+0.10;     } } package com.clark.decoratepattern.decorate; import com.clark.decoratepattern.abstractclass.Beverage; import com.clark.decoratepattern.abstractclass.CondimentDecorate; /**  * 摩卡裝飾調料類  * @author Administrator  *  */ public class Mocha extends CondimentDecorate {     Beverage beverage;     public Mocha(Beverage beverage){         this.beverage=beverage;     }     //返回裝飾調料的同時把其它的調料也描述     public String getDescription() {         return this.beverage.getDescription()+",Mocha";     }     //返回增長Mocha後的調料總價格     public double cost() {         return 0.20+this.beverage.cost();     } } package com.clark.decoratepattern.decorate; import com.clark.decoratepattern.abstractclass.Beverage; import com.clark.decoratepattern.abstractclass.CondimentDecorate; /**  * 豆漿Soy調料的裝飾  * @author Administrator  *  */ public class Soy extends CondimentDecorate {     Beverage beverage;     public Soy(Beverage beverage) {         this.beverage=beverage;     }     @Override     public String getDescription() {         return this.beverage.getDescription()+",Soy";     }     @Override     public double cost() {         return this.beverage.cost()+0.15;     } } package com.clark.decoratepattern.decorate; import com.clark.decoratepattern.abstractclass.Beverage; import com.clark.decoratepattern.abstractclass.CondimentDecorate; /**  * 奶泡Whip調料裝飾對象  * @author Administrator  *  */ public class Whip extends CondimentDecorate {     Beverage beverage;     public Whip(Beverage beverage){         this.beverage=beverage;     }     @Override     public String getDescription() {         return this.beverage.getDescription()+",Whip";     }     @Override     public double cost() {         return this.beverage.cost()+0.10;     } } 如下是測試類:便可以根據客戶的需求來生產咖啡 package com.clark.decoratepattern; import com.clark.decoratepattern.abstractclass.Beverage; import com.clark.decoratepattern.decorate.Milk; import com.clark.decoratepattern.decorate.Mocha; import com.clark.decoratepattern.decorate.Soy; import com.clark.decoratepattern.decorate.Whip; /**  * Test class  * @author Administrator  *  */ public class Test {     public static void main(String[] args) {         //來一杯濃縮咖啡,之家牛奶Milk         Beverage bev=new Espresso();         bev=new Milk(bev);         System.out.println(bev.getDescription()+" $"+bev.cost());         //來一杯深陪咖啡,加牛奶和摩卡         Beverage bev2=new DarkRoast();         bev2=new Milk(bev2);         bev2=new Mocha(bev2);         System.out.println(bev2.getDescription()+" $"+bev2.cost());         //來一杯低咖啡因,內加牛奶、摩卡、奶泡         Beverage bev3=new HouseBlend();         bev3=new Milk(bev3);         bev3=new Mocha(bev3);         bev3=new Whip(bev3);         System.out.println(bev3.getDescription()+" $"+bev3.cost());         //來一杯綜合的咖啡,內部加奶牛、摩卡、奶泡、豆漿         Beverage bev4=new Decaf();         bev4=new Milk(bev4);         bev4=new Mocha(bev4);         bev4=new Whip(bev4);         bev4=new Soy(bev4);         System.out.println(bev4.getDescription()+" $"+bev4.cost());     } }
相關文章
相關標籤/搜索