我正在制作一个基本的比萨饼计划。该计划使用装饰师图案设计将配料添加到比萨饼中。
{{1}}
我的代码运作良好,并设法创建披萨和放置其配料。 问题是,我会从输入文件中获取披萨和顶级订单。
输入文件示例:
AddTopping 7 HotPepper Soudjouk Salami(7是披萨的ID)
AddTopping 1 HotPepper Onion
.....
并且必须嵌套比萨饼(如新萨拉米香肠(新辣椒(新洋葱)(披萨)))。是否有任何不同的方式/方法可供使用而不是写下许多如果 - 其他陈述?
编辑:文件中将有4种不同的浇头,披萨最多可包含3种浇头。
答案 0 :(得分:0)
为什么你认为你会有很多ifs?我假设您的意思是您将解析订单,然后必须根据您在那里找到的内容构建一串调用。我在这里看到的问题是Decorator需要编译时调用构造。此外,Decorator主要用于添加正交的东西,主机类不需要知道的情况。你正在做的事情可能更适合责任链。
责任链的好处是:
或者,您可以将解析的顺序建模为解释器,并将构造过程变为访客模式。 (配对AST构建然后进行评估的常用方法。)
答案 1 :(得分:-1)
你的代码对我来说很奇怪。首先,你说:
Pizza pizza = new PizzaBakery();
然后你做了:
pizza = new Salami(new Pepper(new Onion(pizza)));
这意味着“披萨”现在是“萨拉米香肠”的对象。根据你的描述,我会做这样的事情:
在Pizza课程中添加方法:
public class Pizza {
// constructor
public Pizza (...) {
// ...
}
// function to add toppings
public void addToppings (Salami s, Pepper p, Onion o) {
// ...
}
}
现在重写你的主要功能:
public static void main (String[] args) {
Pizza pizza = new Pizza();
Salami s1 = new Salami(...);
Pepper p1 = new Pepper(...);
Onion o1 = new Onion(...);
pizza.addToppings(s1, p1, o1);
}