装饰者模式,用于给一个主体添加一些装饰。比如说,一个蛋糕,我们选择加不同的水果,这样就变成不同的水果蛋糕,也可以添加牛奶,变成牛奶蛋糕。如此等等。本文的例子以实现不同的蛋糕为例。
首先,我们要创建一个蛋糕对象。
public class Cake {
private int size;
private BigDecimal price;
public Cake() {
}
public Cake(int size, BigDecimal price) {
this.size = size;
this.price = price;
}
public BigDecimal getCakePrice() {
return this.price;
}
public String getCake() {
return "一个" + size + "寸蛋糕";
}
}
然后,我们要写一个装饰类继承我们的蛋糕类,并且将蛋糕作为装饰类的属性。
public abstract class CakeDecorator extends Cake {
private Cake cake;
public CakeDecorator(Cake cake) {
this.cake = cake;
}
@Override
public BigDecimal getCakePrice() {
return this.cake.getCakePrice();
}
@Override
public String getCake() {
return this.cake.getCake();
}
}
接着,我们写两种水果装饰继承我们的蛋糕装饰类。
public class AppleDecorator extends CakeDecorator {
private static final BigDecimal APPLE_PRICE = BigDecimal.TEN;
public AppleDecorator(Cake cake) {
super(cake);
}
@Override
public BigDecimal getCakePrice() {
return super.getCakePrice().add(APPLE_PRICE);
}
@Override
public String getCake() {
return super.getCake() + "\r\n" + "+ 苹果";
}
}
public class BananaDecorator extends CakeDecorator {
private static final BigDecimal BANANA_PRICE = BigDecimal.valueOf(5);
public BananaDecorator(Cake cake) {
super(cake);
}
@Override
public BigDecimal getCakePrice() {
return super.getCakePrice().add(BANANA_PRICE);
}
@Override
public String getCake() {
return super.getCake() + "\r\n" + "+ 香蕉";
}
}
这样,如果我们要买个蛋糕,既要苹果又要香蕉的话就可以这么创建对象。
public class Main {
public static void main(String[] args) {
Cake cake = new Cake(8, BigDecimal.valueOf(20));
AppleDecorator appleCake = new AppleDecorator(cake);
BananaDecorator appleBananaCake = new BananaDecorator(appleCake);
System.out.println(appleBananaCake.getCake());
System.out.println("--------");
System.out.println("价格:" + appleBananaCake.getCakePrice());
}
}
而且以后,如果我们要添加不同的配料只需要继承蛋糕装饰类CakeDecorator就可以了。