返回

装饰者模式-煎饼果子的主场

前端

装饰者模式简介

装饰者模式是一种结构型设计模式,它允许您在不改变现有对象的情况下为其添加新功能。这是一种非常灵活的设计模式,可以用于许多不同的场景。

在装饰者模式中,您有一个基础对象和一个或多个装饰器对象。基础对象提供基本功能,而装饰器对象则添加额外的功能。装饰器对象可以将它们添加到基础对象,以创建一个新的对象,该对象具有基础对象的所有功能以及装饰器对象添加的附加功能。

煎饼果子的主场

为了更好地理解装饰者模式,我们来看一个例子:煎饼果子。

煎饼果子是一种中国街头小吃,它由面粉、鸡蛋和葱花制成。基本的煎饼果子只包含这三种成分,但您也可以添加其他成分,如肉、蔬菜或奶酪,以制作出不同的口味。

在装饰者模式中,基础对象就是基本的煎饼果子。装饰器对象则是那些可以添加到煎饼果子中的其他成分。例如,肉、蔬菜或奶酪都是煎饼果子的装饰器对象。

当您想制作一个煎饼果子时,您可以先创建一个基础对象,然后将您想要的装饰器对象添加到它。这样,您就可以创建一个具有您想要的口味的煎饼果子。

代码实现

以下是如何在 Java 中实现装饰者模式的示例:

public interface Pancake {
  String getDescription();
  double cost();
}

public class BasicPancake implements Pancake {
  @Override
  public String getDescription() {
    return "Basic pancake";
  }

  @Override
  public double cost() {
    return 1.0;
  }
}

public abstract class PancakeDecorator implements Pancake {
  protected Pancake pancake;

  public PancakeDecorator(Pancake pancake) {
    this.pancake = pancake;
  }

  @Override
  public String getDescription() {
    return pancake.getDescription();
  }

  @Override
  public double cost() {
    return pancake.cost();
  }
}

public class MeatDecorator extends PancakeDecorator {
  public MeatDecorator(Pancake pancake) {
    super(pancake);
  }

  @Override
  public String getDescription() {
    return pancake.getDescription() + ", with meat";
  }

  @Override
  public double cost() {
    return pancake.cost() + 1.5;
  }
}

public class VegetableDecorator extends PancakeDecorator {
  public VegetableDecorator(Pancake pancake) {
    super(pancake);
  }

  @Override
  public String getDescription() {
    return pancake.getDescription() + ", with vegetables";
  }

  @Override
  public double cost() {
    return pancake.cost() + 1.0;
  }
}

public class CheeseDecorator extends PancakeDecorator {
  public CheeseDecorator(Pancake pancake) {
    super(pancake);
  }

  @Override
  public String getDescription() {
    return pancake.getDescription() + ", with cheese";
  }

  @Override
  public double cost() {
    return pancake.cost() + 0.5;
  }
}

public class Main {
  public static void main(String[] args) {
    Pancake pancake = new BasicPancake();

    pancake = new MeatDecorator(pancake);
    pancake = new VegetableDecorator(pancake);
    pancake = new CheeseDecorator(pancake);

    System.out.println(pancake.getDescription());
    System.out.println(pancake.cost());
  }
}

在上面的示例中,BasicPancake 类是基础对象,它代表基本煎饼果子。PancakeDecorator 类是装饰器对象,它可以添加到基本煎饼果子中,以添加额外的功能。MeatDecoratorVegetableDecoratorCheeseDecorator 类是装饰器对象的具体实现,它们分别代表肉、蔬菜和奶酪装饰器。

main 方法中,我们创建了一个 BasicPancake 对象,然后将 MeatDecoratorVegetableDecoratorCheeseDecorator 装饰器对象添加到它。这样,我们就创建了一个具有肉、蔬菜和奶酪口味的煎饼果子。

最后,我们打印煎饼果子的和价格。

结论

装饰者模式是一种非常灵活的设计模式,可以用于许多不同的场景。它允许您在不改变现有对象的情况下为其添加新功能。这使得装饰者模式非常适合于需要经常修改或扩展的对象。