装饰者的抽象类继承被装饰者的抽象类。public abstract class AbstractDecorator extends ABattercake
被装饰对象作为抽象装饰类的成员变量,装饰者抽象类中包含参数为被装饰者的构造方法。
装饰类重写抽象类中的方法。
public abstract class ABattercake {
protected abstract String getDesc();
protected abstract int cost();
}
public abstract class AbstractDecorator extends ABattercake{
//被装饰者作为成员变量
private ABattercake aBattercake;
//被装饰者作为构造函数参数
public AbstractDecorator(ABattercake aBattercake) {
this.aBattercake = aBattercake;
}
//重写被装饰者中的方法
@Override
protected String getDesc() {
return this.aBattercake.getDesc();
}
//重写被装饰者中的方法
@Override
protected int cost() {
return this.aBattercake.cost();
}
}
public class Battercake extends ABattercake {
@Override
protected String getDesc() {
return "煎饼";
}
@Override
protected int cost() {
return 8;
}
}
public class EggDecorator extends AbstractDecorator {
public EggDecorator(ABattercake aBattercake) {
super(aBattercake);
}
@Override
protected String getDesc() {
return super.getDesc()+" 再加一个鸡蛋";
}
@Override
protected int cost() {
return super.cost() + 1;
}
}
public class SausageDecorator extends AbstractDecorator {
public SausageDecorator(ABattercake aBattercake) {
super(aBattercake);
}
@Override
protected String getDesc() {
return super.getDesc() + " 再加一根香肠";
}
@Override
protected int cost() {
return super.cost() + 2;
}
}
public class Test {
public static void main(String[] args) {
ABattercake aBattercake = new Battercake();
AbstractDecorator eggDecorator = new EggDecorator(aBattercake);
//由于被装饰者与装饰者继承同一个抽象类,这里可以传入被装饰过得装饰者
AbstractDecorator sausageDecorator = new SausageDecorator(eggDecorator);
System.out.println("煎饼套餐:"+sausageDecorator.getDesc()+" 价格:"+sausageDecorator.cost());
}
}