Java中的嵌套调用(装饰模式)

时间:2018-04-21 22:55:56

标签: java design-patterns

我正在制作一个基本的比萨饼计划。该计划使用装饰师图案设计将配料添加到比萨饼中。

{{1}}

我的代码运作良好,并设法创建披萨和放置其配料。 问题是,我会从输入文件中获取披萨和顶级订单。

输入文件示例:

AddTopping 7 HotPepper Soudjouk Salami(7是披萨的ID)

AddTopping 1 HotPepper Onion

.....

并且必须嵌套比萨饼(如新萨拉米香肠(新辣椒(新洋葱)(披萨)))。是否有任何不同的方式/方法可供使用而不是写下许多如果 - 其他陈述?

编辑:文件中将有4种不同的浇头,披萨最多可包含3种浇头。

2 个答案:

答案 0 :(得分:0)

为什么你认为你会有很多ifs?我假设您的意思是您将解析订单,然后必须根据您在那里找到的内容构建一串调用。我在这里看到的问题是Decorator需要编译时调用构造。此外,Decorator主要用于添加正交的东西,主机类不需要知道的情况。你正在做的事情可能更适合责任链。

责任链的好处是:

  • 你可以在运行时构造链,然后调用第一个项目,它将通过处理程序序列向下级联
  • 另外,如果需要,你可以强制执行订购,例如,如果我点洋葱和蘑菇,可能要先放洋葱

或者,您可以将解析的顺序建模为解释器,并将构造过程变为访客模式。 (配对AST构建然后进行评估的常用方法。)

答案 1 :(得分:-1)

你的代码对我来说很奇怪。首先,你说:

Pizza pizza = new PizzaBakery();

然后你做了:

pizza = new Salami(new Pepper(new Onion(pizza)));

这意味着“披萨”现在是“萨拉米香肠”的对象。根据你的描述,我会做这样的事情:

  1. 在Pizza课程中添加方法:

    public class Pizza {
        // constructor
        public Pizza (...) {
        // ...
        }
    
        // function to add toppings
        public void addToppings (Salami s, Pepper p, Onion o) {
        // ...
        }
    }
    
  2. 现在重写你的主要功能:

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