design-patterns - 装饰器模式:如何仅基于用户输入创建最终对象?
问题描述
我开始学习装饰器模式,这是我第一次遇到这种问题。
令我困扰的是这一行:
Drink drinkObject = new ChocolateDecorator(new SoyDecorator(new Espresso()));
假设我为用户制作了一个简单的界面来选择成分。如何仅根据用户输入在运行时声明对象?
示例:用户选择两个“大豆”,那么对象应该是:
Drink drinkObject = new SoyDecorator(new SoyDecorator(new Espresso()));
public class main {
public static void main(String[] args) {
Drink drinkObject = new ChocolateDecorator(new SoyDecorator(new Espresso()));
System.out.println("Order: "+ drinkObject.nameDescription());
System.out.println("Total Price: " + drinkObject.price());
}
}
abstract class Drink{
public abstract String nameDescription();
public abstract double price();
}
class Espresso extends Drink {
public String nameDescription() {
return "Expresso" + " with:";
}
public double price() {
return 1;
}
}
abstract class DrinkDecorator extends Drink {
protected Drink drink;
public DrinkDecorator(Drink drinkObject) {
this.drink = drinkObject;
}
public abstract String nameDescription();
public abstract double price();
}
class ChocolateDecorator extends DrinkDecorator{
public ChocolateDecorator(Drink drinkObject) {
super(drinkObject);
}
public String nameDescription() {
return this.drink.nameDescription()+ " Chocolate;";
}
public double price() {
return this.drink.price() + 0.25;
}
}
class SoyDecorator extends DrinkDecorator{
public SoyDecorator(Drink drinkObject) {
super(drinkObject);
}
public String nameDescription() {
return this.drink.nameDescription()+ " Soy;";
}
public double price() {
return this.drink.price() + 0.15;
}
}
解决方案
为可能糟糕的 Java 代码道歉:该语言不是我的强项。
我相信这个想法是迭代输入并选择在每次迭代中应用哪个装饰器。就像是
Drink drinkObject = new Espresso();
for (String kind: args) {
switch (kind) {
case "soy": drinkObject = new SoyDecorator(drinkObject);
break;
case "chocolate": drinkObject = new ChocolateDecorator(drinkObject);
break;
default: break;
}
}
推荐阅读
- python - 我如何保持在同一条线上?
- reactjs - ReactJS子组件在父状态改变后不更新
- java - Java for 循环,同时将变量保持在一个范围内
- java - SLF4J:使用 log4j 时无法加载类“org.slf4j.impl.StaticLoggerBinder”错误
- r - 如何使用 R 在绘图上打印外文
- python - 当变量上升时,下次循环运行时不会使用新的变量号
- python-3.x - 函数调用中的争论没有价值
- jquery - 在日历引导数组中推送数组
- firebase - 如何在flutter firebase中删除一对多关联
- c# - 创建一个可以返回控件列表的函数,其中包含控件标签中的特定信息