装饰器模式应用场景
装饰器模式是一种类似于搭积木一样的模式,在底层会提供一个基础版本,可以在上面累加各种各样不同的配件,比如一个空房子,可以自由组合里面的家具。
装饰器模式的使用
首先需要写一个接口或抽象类,并且一个基础版本来继承这个接口。
public abstract class BatterCake {
protected abstract String getMsg();
protected abstract int getPrice();
}
public class BaseBatterCake extends BatterCake{
@Override
protected String getMsg() {
return "煎饼";
}
@Override
protected int getPrice() {
return 5;
}
}
然后提供一个对外的装饰器继承这个接口,此时这个对外接口必须提供一个构造方法,传入的参数为父类的对象,同时继承父类的方法。
public class BatterCakeDecorator extends BatterCake{
private BatterCake batterCake;
public BatterCakeDecorator(BatterCake batterCake) {
this.batterCake = batterCake;
}
protected String getMsg() {
return this.batterCake.getMsg();
}
protected int getPrice() {
return this.batterCake.getPrice();
}
}
然后可以通过这个装饰器向下扩展很多个基础扩展,实现对基础版本的叠加。
public class EggDecorator extends BatterCakeDecorator{
public EggDecorator(BatterCake batterCake) {
super(batterCake);
}
@Override
protected String getMsg() {
return super.getMsg() + "+鸡蛋";
}
@Override
protected int getPrice() {
return super.getPrice() + 1;
}
}
public class SauageDecorator extends BatterCakeDecorator{
public SauageDecorator(BatterCake batterCake) {
super(batterCake);
}
@Override
protected String getMsg() {
return super.getMsg() + "+香肠";
}
@Override
protected int getPrice() {
return super.getPrice() + 2;
}
}
测试以上的代码
public class Test {
public static void main(String[] args) {
BatterCake batterCake;
batterCake = new BaseBatterCake();
batterCake = new EggDecorator(batterCake);
batterCake = new EggDecorator(batterCake);
batterCake = new SauageDecorator(batterCake);
System.out.println(batterCake.getMsg()+", 总价:"+batterCake.getPrice());
}
}
测试结果
煎饼+鸡蛋+鸡蛋+香肠, 总价:9
Process finished with exit code 0
装饰器模式类图
装饰器模式就是利用Decorator装饰器的构造方法创建一个Base基础类,通过Decorator装饰器的子类对装饰器不断地叠加达到搭积木的效果。