目的:不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案来扩展原有对象的功能
public abstract class Cake {
public abstract String getCakeMsg();//获取蛋糕的基本信息
public abstract BigDecimal getPrice();//获取蛋糕的价格
}
public class BaseCake extends Cake {
@Override
public String getCakeMsg() {//获取蛋糕信息
return "我是一个8英寸的普通蛋糕";
}
@Override
public BigDecimal getPrice() {//获取蛋糕价格
return new BigDecimal("68");
}
}
public abstract class CakeDecorator extends Cake{
private Cake cake;
public CakeDecorator(Cake cake) {
this.cake = cake;
}
@Override
public String getCakeMsg() {//获取蛋糕的信息
return this.cake.getCakeMsg();//调用被装饰的对象原生方法
}
@Override
public BigDecimal getPrice() {//获取蛋糕价格
return this.cake.getPrice();//调用被装饰的对象原生方法
}
}
public class CakeAddGrapeDecorator extends CakeDecorator {
public CakeAddGrapeDecorator(Cake cake) {
super(cake);
}
@Override
public String getCakeMsg() {//获取蛋糕信息
return super.getCakeMsg() + "+1个葡萄";//调用父类装饰器方法,再加上自定义的装饰(加1个葡萄)
}
@Override
public BigDecimal getPrice() {//获取价格
return super.getPrice().add(new BigDecimal("5"));//调用父类装饰器方法,再加上自定义的装饰(加5块钱)
}
}
public class CakeAddMangoDecorator extends CakeDecorator {
public CakeAddMangoDecorator(Cake cake) {
super(cake);
}
@Override
public String getCakeMsg() {//获取蛋糕信息
return super.getCakeMsg() + "+1个芒果";//调用父类装饰器方法,再加上自定义的装饰(加1个芒果)
}
@Override
public BigDecimal getPrice() {//获取价格
return super.getPrice().add(new BigDecimal("10"));//调用父类装饰器方法,再加上自定义的装饰(加10块钱)
}
}
public class TestCakeDecorator {
public static void main(String[] args) {
Cake cake = null;
//普通蛋糕
cake = new BaseCake();
System.out.println(cake.getCakeMsg() + ",价格:" + cake.getPrice());
//加一个芒果
cake = new CakeAddMangoDecorator(cake);//芒果装饰器
System.out.println(cake.getCakeMsg() + ",价格:" + cake.getPrice());
//加一个葡萄
cake = new CakeAddGrapeDecorator(cake);//葡萄装饰器
System.out.println(cake.getCakeMsg() + ",价格:" + cake.getPrice());
//再加一个芒果
cake = new CakeAddMangoDecorator(cake);//芒果装饰器
System.out.println(cake.getCakeMsg() + ",价格:" + cake.getPrice());
}
}
优点:
降低耦合,拓展型好
添加功能方便
缺点:
类多