首页 > 解决方案 > 装饰器模式:如何仅基于用户输入创建最终对象?

问题描述

我开始学习装饰器模式,这是我第一次遇到这种问题。

令我困扰的是这一行:

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;
    }
}

标签: design-patterns

解决方案


为可能糟糕的 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;
    }
}

推荐阅读