装饰者模式

装饰者模式:
动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
以饮料店配调料为例:
//测试类
public class StarbuzzCoffee {
 public static void main(String[] args) {
  Beverage beverage = new Espresso();//点一杯没有任何调料的咖啡
  System.out.println(beverage.getDescription()+"$"+beverage.cost());//打印描述和价格
  Beverage beverage2 = new HouseBlend();//点一杯摩卡、奶泡搭配的HouseBlend
  beverage2 = new Mocha(beverage2);
  beverage2 = new Whip(beverage2);
  System.out.println(beverage2.getDescription()+"$"+beverage2.cost());//打印描述和价格
 }
}

public abstract class Beverage {//饮料超类
 String description = "Unknown Beverage";
 
 public String getDescription() {
  return description;
 }
 
 public abstract double cost();
}
public class Espresso extends Beverage{//饮料
 public Espresso() {
  description = "Espresso";
 }
 public double cost() {
  return 1.99;
 }
}

public class HouseBlend extends Beverage{//饮料
 public HouseBlend() {
  description = "HouseBlend";
 }
 public double cost() {
  return .98;
 }
}
public abstract class CondimentDecorator extends Beverage{//装饰者超类
 public abstract String getDescription();
}
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 Whip extends CondimentDecorator{
 Beverage beverage;
 
 public Whip(Beverage beverage) {
  this.beverage=beverage;
 }
 
 public String getDescription() {
  return beverage.getDescription()+",Whip";
 }
 
 public double cost() {
  return .30+beverage.cost();
 }
}
posted @ 2019-11-11 22:30  月下独酌一杯酒  阅读(114)  评论(0)    收藏  举报