为什么装饰器设计模式在示例中总是显示为 类 和 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,它们并没有做很多事情。所以你说得有道理,模式是工具箱中的一个有用工具,但也许你不会经常使用它。
例如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,它们并没有做很多事情。所以你说得有道理,模式是工具箱中的一个有用工具,但也许你不会经常使用它。