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());     } }
相关文章
相关标签/搜索