设计模式(结构型设计模式——装饰者模式)
装饰者模式
基本定义
模式结构
代码实现
Component:抽象构件, 被装饰抽象类
public interface Cake {
String nameDetail();
Double price();
}
ConcreteComponent: 抽象实现类,被装饰对象类
public class CakeImpl implements Cake {
/**
* 手抓饼配料->鸡蛋,牛肉,蔬菜,
* 组合方式:1.鸡蛋,2.牛肉,3.蔬菜,4. 鸡蛋+牛肉,5. 鸡蛋+蔬菜,6.牛肉+蔬菜, 7.鸡蛋+牛肉+蔬菜
*/
public String nameDetail() {
return "原味手抓饼";
}
public Double price() {
return 5d;
}
}
Decorator: 抽象装饰类
public class CakeDecorator implements Cake{
Cake cake;
//装饰实现类
public CakeDecorator(Cake cake) {
this.cake = cake;
}
public String nameDetail() {
return cake.nameDetail();
}
public Double price() {
return cake.price();
}
}
ConcreteDecorator: Decorator具体实现类
鸡蛋手抓饼 +1.5元
public class EggCakeDecorator extends CakeDecorator{
public EggCakeDecorator(Cake cake) {
super(cake);
}
//关键部分
@Override
public String nameDetail() {
return "鸡蛋," + cake.nameDetail();
}
@Override
public Double price() {
return 1.5 + cake.price();
}
}
牛肉手抓饼 +2元
public class MeetCakeDecorator extends CakeDecorator{
public MeetCakeDecorator(Cake cake) {
super(cake);
}
//关键部分
@Override
public String nameDetail() {
return "牛肉," + cake.nameDetail();
}
@Override
public Double price() {
return 2 + cake.price();
}
}
蔬菜手抓饼 +0.5元
public class VeggCakeDecorator extends CakeDecorator{
public VeggCakeDecorator(Cake cake) {
super(cake);
}
//关键部分
@Override
public String nameDetail() {
return "蔬菜," + cake.nameDetail();
}
@Override
public Double price() {
return 0.5 + cake.price();
}
}
测试类
@Slf4j
public class Test {
public static void main(String[] args) {
Cake cake = new CakeImpl();
log.info("小红想吃{}, 价格:¥{}", cake.nameDetail(), cake.price());
CakeDecorator cakeEgg = new EggCakeDecorator(cake);
log.info("小明想吃{}, 价格:¥{}", cakeEgg.nameDetail(), cakeEgg.price());
CakeDecorator meetCake = new MeetCakeDecorator(cakeEgg);
CakeDecorator veggCake = new VeggCakeDecorator(meetCake);
log.info("小张想吃{}, 价格:¥{}", veggCake.nameDetail(), veggCake.price());
}
}