设计原则:(开放-关闭)类应该对扩展开放,对修改关闭
装饰者:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案
缺点:导致设计中出现许多小对象,如果过度使用,会让程序变得复杂
java实现类:i/o
//抽象饮料
public abstract class Beverage {
String description = "unknown beverage";
public String getDescription() {
return description;
}
abstract double cost();
}
//饮料类型 浓咖啡
public class Espresso extends Beverage {
public Espresso() {
// TODO Auto-generated constructor stub
description = "espresso";
}
@Override
double cost() {
// TODO Auto-generated method stub
return 1.99;
}
}
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
//装饰类型 摩卡
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
// TODO Auto-generated constructor stub
this.beverage = beverage;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription() + ", mocha";
}
@Override
double cost() {
// TODO Auto-generated method stub
return 0.20 + beverage.cost();
}
}
//豆浆
public class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage) {
// TODO Auto-generated constructor stub
this.beverage = beverage;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription() + ",soy";
}
@Override
double cost() {
// TODO Auto-generated method stub
return 0.3 + beverage.cost();
}
}
//奶泡
public class Whip extends CondimentDecorator {
Beverage beverage;
public Whip(Beverage beverage) {
// TODO Auto-generated constructor stub
this.beverage = beverage;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription() + ",whip";
}
@Override
double cost() {
// TODO Auto-generated method stub
return beverage.cost() + 0.4;
}
}
public class StarbuzzCoffee {
public static void main(String[] args) {
// Beverage beverage = new Espresso();
// System.err.println(beverage.getDescription() + ",cost" + beverage.cost());
Beverage beverage2 = new Espresso();
beverage2 = new Soy(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription() + ",cost" + beverage2.cost());
}
}
//输出结果
espresso,soy, mocha,whip,cost2.89