装饰者模式(Decorator Pattern)

  • 设计原则

     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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值