为什么装饰器设计模式在示例中总是显示为 类 和 sub类?

Why are decorator design patterns always shown as classes and subclasses in examples?

例如freecodecamp.org中使用了运行咖啡店的例子:

public abstract class Beverage {
private String description;

public Beverage(String description) {
    super();
    this.description = description;
}

public String getDescription() {
    return description;
}

public abstract double cost();
}

然后他们将子类用于所有各种附加组件,例如各种烤肉和 sugar/milk:

public abstract class AddOn extends Beverage {
protected Beverage beverage;

public AddOn(String description, Beverage bev) {
    super(description);
    this.beverage = bev;
}

public abstract String getDescription();
}

然后他们跟进了 AddOn 的几个子类:

public class Sugar extends AddOn {
public Sugar(Beverage bev) {
    super(“Sugar”, bev);
}

@Override
public String getDescription() {
    return beverage.getDescription() + “ with Mocha”;
}

@Override
public double cost() {
    return beverage.cost() + 50;
}
}

public class Milk extends AddOn {

public Milk(Beverage bev) {
    super(“Milk”, bev);
}

@Override
public String getDescription() {
    return beverage.getDescription() + “ with Milk”;
}

@Override  public double cost() {
    return beverage.cost() + 100;
}
}

我不明白的是,为什么一切都是子类,而不是将一切都作为 Beverage 中的一种方法来增加一个大的描述并增加通用成本?

你是对的,对于这些非常简单的例子,一个大 class 可能会更好。但是,在实际代码中,单个装饰器很可能有很多代码来进行装饰。 Single Responsiblity Principle 然后适用。我们不想创造一个做很多事情的大神 class,我们想把事情分解并以某种方式模块化。特别是当我们想改变事情的工作方式时,我们不想总是改变相同的 class。装饰器允许我们模块化和扩展,同时保留多态性和我们正在创建的对象的很多灵活性。

话虽如此,虽然装饰器是最初的四人帮设计模式之一,但您在现实世界中很少见到它们。您很容易得到很多令人困惑的小 classes,它们并没有做很多事情。所以你说得有道理,模式是工具箱中的一个有用工具,但也许你不会经常使用它。