装饰器模式(Decorator Pattern)
背景介绍:
小胖子对自己的披萨不够牛逼感到有些失望,于是决定为披萨增加一些奇特的调料,使得披萨更加美味独特。他想要在不改变原有披萨结构的基础上,动态地添加新的功能。为了实现这一愿望,小胖子决定引入装饰器模式。
设计模式应用:
装饰器模式
为了让披萨更加丰富多彩,小胖子引入了装饰器模式。他创建了一个基本披萨类,然后通过装饰器类动态地为披萨添加各种调料,比如辣椒、芝士等。
代码示例:
// 基础披萨接口
interface Pizza {
String getDescription();
double cost();
}
// 基础披萨类
class BasicPizza implements Pizza {
@Override
public String getDescription() {
return "基础披萨";
}
@Override
public double cost() {
return 8.0;
}
}
// 披萨装饰器抽象类
abstract class PizzaDecorator implements Pizza {
protected Pizza decoratedPizza;
public PizzaDecorator(Pizza decoratedPizza) {
this.decoratedPizza = decoratedPizza;
}
@Override
public String getDescription() {
return decoratedPizza.getDescription();
}
@Override
public double cost() {
return decoratedPizza.cost();
}
}
// 辣椒装饰器
class ChiliDecorator extends PizzaDecorator {
public ChiliDecorator(Pizza decoratedPizza) {
super(decoratedPizza);
}
@Override
public String getDescription() {
return super.getDescription() + " + 辣椒";
}
@Override
public double cost() {
return super.cost() + 2.0; // 加辣椒需要额外支付2元
}
}
// 芝士装饰器
class CheeseDecorator extends PizzaDecorator {
public CheeseDecorator(Pizza decoratedPizza) {
super(decoratedPizza);
}
@Override
public String getDescription() {
return super.getDescription() + " + 芝士";
}
@Override
public double cost() {
return super.cost() + 3.5; // 加芝士需要额外支付3.5元
}
}
// 客户端
public class DecoratorPatternExample {
public static void main(String[] args) {
// 制作基础披萨
Pizza basicPizza = new BasicPizza();
System.out.println("基础披萨: " + basicPizza.getDescription() + ",价格:" + basicPizza.cost() + "元");
// 制作加辣椒的披萨
Pizza pizzaWithChili = new ChiliDecorator(basicPizza);
System.out.println("加辣椒的披萨: " + pizzaWithChili.getDescription() + ",价格:" + pizzaWithChili.cost() + "元");
// 制作加芝士的披萨
Pizza pizzaWithCheese = new CheeseDecorator(basicPizza);
System.out.println("加芝士的披萨: " + pizzaWithCheese.getDescription() + ",价格:" + pizzaWithCheese.cost() + "元");
// 制作既加辣椒又加芝士的披萨
Pizza pizzaWithChiliAndCheese = new CheeseDecorator(new ChiliDecorator(basicPizza));
System.out.println("加辣椒和芝士的披萨: " + pizzaWithChiliAndCheese.getDescription() + ",价格:" + pizzaWithChiliAndCheese.cost() + "元");
}
}
动态添加调料
在这个例子中,装饰器模式使得小胖子可以动态地为披萨添加各种调料,而不需要改变基础披萨类的结构。通过创建不同的装饰器类,可以组合不同的调料,使得披萨更加丰富多彩。