11-1 装饰者模式讲解
11-2 装饰者模式coding
有一个煎饼类:
public class Battercake {
protected String getDesc() {
return "煎饼";
}
protected int cost() {
return 8;
}
}
煎饼加鸡蛋类:
public class BattercakeWithEgg extends Battercake {
@Override
public String getDesc() {
return super.getDesc()+"加一个鸡蛋";
}
@Override
public int cost() {
return super.cost()+1;
}
}
煎饼加鸡蛋加香肠类:
public class BattercakeWithEggSausage extends BattercakeWithEgg{
@Override
public String getDesc() {
return super.getDesc()+"一个香肠";
}
@Override
public int cost() {
return super.cost()+2;
}
}
测试:
public class Test {
public static void main(String[]args){
Battercake battercake = new Battercake();
System.out.println(battercake.getDesc()+"销售价格:"+battercake.cost());
BattercakeWithEgg battercakeWithEgg = new BattercakeWithEgg();
System.out.println(battercakeWithEgg.getDesc()+"销售价格:"+battercakeWithEgg.cost());
BattercakeWithEggSausage battercakeWithEggSausage = new BattercakeWithEggSausage();
System.out.println(battercakeWithEggSausage.getDesc()+"销售价格:"+battercakeWithEggSausage.cost());
}
}
执行结果:
煎饼销售价格:8
煎饼加一个鸡蛋销售价格:9
煎饼加一个鸡蛋一个香肠销售价格:11
这个时候,有一个人加了两个鸡蛋,这个时候,根据上面的就是不能算出价格的;
现在,我们用装饰者模式来写:
有一个抽象的煎饼类:
public abstract class ABattercake {
protected abstract String getDesc();
protected abstract int cost();
}
煎饼类继承于上面的抽象兼饼类:
public class Battercate extends ABattercake {
@Override
protected String getDesc() {
return "煎饼";
}
@Override
protected int cost() {
return 8;
}
}
我们让抽象的装饰者类继承抽象的实体:
public class AbstractDecorator extends ABattercake{
private ABattercake aBattercake;
public AbstractDecorator(ABattercake aBattercake) {
this.aBattercake = aBattercake;
}
@Override
protected String getDesc() {
return aBattercake.getDesc();
}
@Override
protected int cost() {
return aBattercake.cost();
}
}
煎饼添加鸡蛋的装饰类继承于抽象的装饰类:
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;
aBattercake = new Battercate();
aBattercake = new EggDecorator(aBattercake);
aBattercake = new EggDecorator(aBattercake);
aBattercake = new SausageDecorator(aBattercake);
System.out.println(aBattercake.getDesc()+"价格为:"+aBattercake.cost());
}
}
执行结果:
煎饼加一个鸡蛋加一个鸡蛋加一根香肠价格为:12