在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
现在有一个咖啡店,有两种咖啡,三种调料,设计一个咖啡销售系统。
//咖啡超类的设计,包含咖啡的描述,及其价钱的计算
public abstract class Beverage {
String Description = "Unknow Beverage";
public String getDescription() {
return Description;
}
public abstract double cost();
}
//HouseBlend类咖啡的实现
public class HouseBlend extends Beverage {
public HouseBlend() { //本咖啡描述
super();
Description = "House Blend Coffee";
}
@Override
public double cost() { //计算价钱
return 0.89;
}
}
//Espresso类咖啡的实现
public class Espresso extends Beverage {
public Espresso() {
super();
Description = "Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
//调料抽象类设计,继承Beverage可以把调料指向Beverage
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
//抹茶调料
public class Mocha extends CondimentDecorator {
Beverage beverage; //本身的咖啡类
//添加调料时把饮料加进去
public Mocha(Beverage beverage) {
super();
this.beverage = beverage;
}
//在描述后面加上抹茶
@Override
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
//价格上面加上自己的价格
@Override
public double cost() {
return 0.2 + beverage.cost();
}
}
//同理,创建一个豆浆
public class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage) {
super();
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Soy";
}
@Override
public double cost() {
return 0.15 + beverage.cost();
}
}
//同理创建一个奶泡
public class Whip extends CondimentDecorator {
Beverage beverage;
public Whip(Beverage beverage) {
super();
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Whip";
}
@Override
public double cost() {
return 0.1 + beverage.cost();
}
}
@Test
public void method() {
//创建一个咖啡类,不加调料
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " $" + beverage.cost());
//打印咖啡1:Espresso $1.99
//创建一个咖啡类,添加两次抹茶,一次奶泡
Beverage beverage2 = new HouseBlend();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription() + " $" + beverage.cost());
//打印咖啡2:House Blend Coffee, Mocha, Mocha, Whip $1.3900000000000001
//创建一个咖啡类,添加豆浆,抹茶,奶泡
Beverage beverage3 = new HouseBlend();
beverage2 = new Soy(beverage3);
beverage2 = new Mocha(beverage3);
beverage2 = new Whip(beverage3);
System.out.println(beverage3.getDescription() + " $" + beverage.cost());
//打印咖啡3:House Blend Coffee, Soy, Mocha, Whip $1.3900000000000001
}