gpt4 book ai didi

java - 抽象装饰器类而不是装饰器中的功能

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:51:38 24 4
gpt4 key购买 nike

我正在读这本书 Head First Design Patterns在装饰器章节中有以下示例:

Example diagram

在本书中,CondimentDecorator 类被描述为一个抽象装饰器。这是代码示例:

public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}

所以基本上内部只有一个抽象方法,它强制所有子类覆盖 Beverage 类的 getDescription() 方法。

这里是 Mocha 类作为 decorator 的代码示例。

public class Mocha extends CondimentDecorator {
Beverage beverage;

public Mocha(Beverage beverage) {
this.beverage = beverage;
}

public String getDescription() {
return beverage.getDescription() + ", Mocha";
}

public double cost() {
return .20 + beverage.cost();
}
}

其他装饰器(Whip 类、Soy 类...)具有完全相同的代码,除了硬编码的成本数字 (.20) 和名称 (", 摩卡”).

然后我们通过将之前的对象传递给新的装饰器来使用这个装饰器模式。

Beverage beverage = new DarkRoast();
beverage = new Mocha(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);

我的问题是,为什么不简单地将重复的功能从装饰器移动到抽象装饰器?下面是我重构示例的方式。

抽象装饰器:

public abstract class CondimentDecorator extends Beverage {
private Beverage beverage;

protected CondimentDecorator(Beverage previousBeverage) {
this.beverage = previousBeverage;
}

@Override
public String getDescription() {
return beverage.getDescription() + ", " + getAdditionName();
}

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

public abstract String getAdditionName();
public abstract double getAdditionCost();
}

装饰器代码:

public class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
super(beverage);
}

@Override
public String getAdditionName() {
return "Mocha";
}

@Override
public double getAdditionCost() {
return 0.20;
}
}

现在,对于我创建的每个新装饰器,我都被迫通过父类(super class)构造器的构造器提供以前的饮料对象,并且我需要覆盖只返回特定装饰器的唯一值的方法。

这段代码可以吗?或者如果我在抽象装饰器中有功能,它会完全改变装饰器模式的要点吗?

最佳答案

这段代码很好。教科书经常(?)在他们的例子中展示不太完美的代码,这样他们就可以专注于一个特定的概念(在这种情况下 - 装饰器)而不会引起对其他细节的注意。事实上,您找到了改进本书代码的方法,这表明您实际上已经充分理解了这个概念,可以巧妙地使用它,而不仅仅是从引用资料中复制粘贴。

关于java - 抽象装饰器类而不是装饰器中的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41382945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com