装饰者模式(Decorator Pattern)

来源:互联网 发布:阿里云香港主机速度慢 编辑:程序博客网 时间:2024/06/08 18:21

  • 设计原则

     1、封装变化
     2、多用组合,少用继承
     3、针对接口编程,不针对现实编程
     4、为交互对象之间的松耦设计而努力
     5、对扩展开放,对修改关闭

  • 装饰者模式

     装饰者模式 —— 动态将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。



代码实现

/** * Component类 * 抽象类 * @author WangChunhe * */public abstract class Beverage {      String description = "Unknown Beverage" ;             public String getDescription() {             return description ;      }       /**       * 抽象方法       * @return       */       public abstract double cost();      }/** * Decorator类 * 抽象类 * @author WangChunhe * */public abstract class CondimentDecoator extends Beverage {       @Override       public double cost() {             // TODO Auto-generated method stub             return 0;      }             /**       * 所有的调料装饰者都必须重新实现getDescription()方法       */       public abstract String getDescription();}/** * 具体组件 * @author WangChunhe * */public class HouseBlend extends Beverage {             public HouseBlend() {             //description 实例变量继承自Beverage             description = "HouseBlend Coffee" ;      }       @Override       public double cost() {             // TODO Auto-generated method stub             return 0.89;      }}/** * 具体组件 * @author WangChunhe * */public class DarkRoast extends Beverage {             public DarkRoast () {             description = "DarkRoast " ;      }       @Override       public double cost() {             // TODO Auto-generated method stub             return 0.99;      }}/** * 具体组件 * @author WangChunhe * */public class Espresso extends Beverage {       public Espresso() {             //description实例变量继承来自Beverage             description = "Espreeso" ;      }                   @Override       public double cost() {             // TODO Auto-generated method stub             return 1.99;      }      }/** * 具体装饰者 * @author WangChunhe * */public class Mocha extends CondimentDecoator {      Beverage beverage;       /**       *       * @param beverage 作为被装饰者       */       public Mocha (Beverage beverage) {             this.beverage = beverage;      }       @Override       public String getDescription() {             // TODO Auto-generated method stub             return beverage .getDescription() + ", Mocha";      }             @Override       public double cost() {             // TODO Auto-generated method stub             return 0.20 + beverage .cost();      }}/** * 具体装饰者 * @author WangChunhe * */public class Soy extends CondimentDecoator {      Beverage beverage;             public Soy (Beverage beverage) {             this.beverage = beverage;      }       @Override       public String getDescription() {             // TODO Auto-generated method stub             return beverage .getDescription() +" , Soy ";      }       @Override       public double cost() {             // TODO Auto-generated method stub             return 0.15 + beverage .cost();      }}/** * 具体装饰者 * @author WangChunhe * */public class Whip extends CondimentDecoator {      Beverage  beverage;                   public Whip (Beverage beverage) {             this.beverage = beverage;                  }       @Override       public String getDescription() {             // TODO Auto-generated method stub             return beverage .getDescription() + ", Whip";      }             @Override       public double cost() {             // TODO Auto-generated method stub             return 0.10 + beverage .cost();      }}/** * 测试类 * @author WangChunhe * */public class StarbuzzCoffee {       /**       * @param args       */       public static void main(String[] args) {             // TODO Auto-generated method stub                        Beverage  beverage = new Espresso();            System. out.println(beverage.getDescription() + " $ " + beverage.cost());                        Beverage beverage2 = new DarkRoast();            beverage2 = new Mocha(beverage2);            beverage2 = new Mocha(beverage2);            beverage2 = new Whip(beverage2);            System. out.println(beverage2.getDescription()  + " $ " + beverage2.cost());                        Beverage beverage3 = new HouseBlend();            beverage3 = new Soy(beverage3);            beverage3 = new Mocha(beverage3);            beverage3 = new Whip(beverage3);            System. out.println(beverage3.getDescription() +  " $ " + beverage3.cost());                  }}
 测试结果


0 0
原创粉丝点击