定义:装饰者模式就是指在不改变现有对象结构的情况下,动态地给对象增加一些职责(额外的功能)的设计模式。
UML 类图:
具体实现:
public abstract class Beverage {
//抽象方法
public abstract double cost();
}
这个继承上一个抽象类,一些装饰内容通过继承这个抽象类实现,实现插拔式编程(也就是动态的)
public abstract class ToppingDecorator extends Beverage {
public abstract double cost();
}
被装饰(也就是固定内容)的内容继承最顶层的抽象方法
public class FruitTea extends Beverage {
@Override
public double cost() {
System.out.println("FruitTea cost: "+15) ;
return 15;
}
}
装饰(也就是动态变化的内容)继承第二个抽象类
public class Pudding extends ToppingDecorator{
private static final int COST = 2;
private final Beverage beverage;
public Pudding(Beverage beverage) {
this.beverage = beverage;
}
@Override
public double cost() {
System.out.println("Adding pudding cost: " +COST);
return COST + beverage.cost();
}
}
小编白话理解:
比如说 去奶茶点下单 奶茶 咖啡就是我们所说的固定内容,而给奶茶加布丁,加珍珠给咖啡加糖加奶就是动态内容;如果代码开始写死加糖加奶需要多少钱,新来的顾客需要加冰,那你就需要改变原来的代码逻辑 并且不能写错,否则会影响之前加糖加奶的逻辑,装饰者模式会在不影响加糖加奶的逻辑上通过继承ToppingDecorator实现加冰的逻辑计算
调用逻辑:
Beverage milkTea = new MilkTea();//点了一杯奶茶
milkTea = new Boba(milkTea);
milkTea = new Boba(milkTea);//加两份珍珠
milkTea = new Pudding(milkTea);//加一份布丁
double cost = milkTea.cost();//计算价格
计算结果:
Adding pudding cost: 2
Adding Boba cost: 3
Adding Boba cost: 3
MlikTea cost: 16
24.0
不理解的地方打在评论区,看见会解答