HeadFirst 设计模式 3装饰者模式 (饮料问题)

设计原则:

类应该对扩展开放,对修改关闭(开放-关闭原则)

装饰者模式:

动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

类图:


具体饮料实例:


注:

CondimentDecorator扩展自Beverage类(继承):装饰者和被装饰者必须是一样的类型,也就是有共同的超类。在这里,我们利用继承达到“类型匹配”,而不是利用继承获得“行为”

行为来源:继承Beverage抽象类,是为了有正确的类型,而不是继承它的行为。行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。


public abstract class Beverage {
  String description = "Unknown Beverage";
  public String getDescription() {
    return description;
  }
  public abstract double cost();
}

public abstract class CondimentDecorator extends Beverage {
  public abstract String getDescription();
}

public class Espresso extends Beverage {
  public Espresso() {
    description = "Espresso";
  }
  public double cost() {
    return 1.99;
  }
}

public class HouseBlend extends Beverage {
  public HouseBlend() {
    description = "House Blend Coffee";
  }
  public double cost() {
    return .89;
  }
}

public class Mocha extends CondimentDecorator {
  Beverage beverage;
  public Mocha(Beverage beverage) {
    this.beverage = beverage;
  }
  public String getDescription() {
    return beverage.getDescription() + ", Mocha";
  }
  public double cost() {
    return .20 + beverage.cost();
  }
}

public class StarbuzzCoffee {
  public static void main(String args[]) {
    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、付费专栏及课程。

余额充值