【问题标题】:Nested call in Java (Decorator Pattern)Java中的嵌套调用(装饰器模式)
【发布时间】:2018-04-22 08:28:45
【问题描述】:

我正在开发一个基本的披萨程序。该程序使用装饰器模式设计将配料添加到披萨中。

public static void main(String[] args) {
    Pizza pizza = new PizzaBakery();
    //lets put Onion,Pepper and Salami into pizza:
    pizza = new Salami(new Pepper(new Onion(pizza)));}

我的代码运行良好,并设法创建比萨饼并放上它的配料。 问题是,我将从输入文件中获取披萨和浇头订单。

输入文件示例:

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

AddTopping 1 HotPepper Onion

.....

并且必须嵌套添加浇头到披萨中(例如 new Salami(new Pepper(new Onion(pizza))) )。有什么不同的方式/方法可以使用而不是编写许多 if- else 语句?

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

【问题讨论】:

标签: java design-patterns


【解决方案1】:

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

责任链的好处是:

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

或者,您可以将订单解析建模为解释器,并将构建过程变成访问者模式。 (将 AST 的构建和评估配对的常用方法。)

【讨论】:

    【解决方案2】:

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

    Pizza pizza = new PizzaBakery();
    

    然后你做了:

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

    这意味着“pizza”现在是“Salami”的对象。根据你的描述,我会这样做:

    1. 在 Pizza 类中添加一个方法:

      public class Pizza {
          // constructor
          public Pizza (...) {
          // ...
          }
      
          // function to add toppings
          public void addToppings (Salami s, Pepper p, Onion o) {
          // ...
          }
      }
      
    2. 现在像这样重写你的 main 函数:

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

    【讨论】:

    • 这不是装饰器模式,因此不能满足练习的要求.. ?
    • 我怀疑只需将 Salami 等类重命名为 SalamiPizza 或类似名称即可消除混淆。
    • @Heran 原始代码只要实现相同的接口就可以。也许只是像 CollinD 所说的那样命名问题
    • 是的,他们实现了相同的接口&我要修改他们的名字
    猜你喜欢
    • 2016-06-11
    • 2020-10-26
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2017-05-25
    相关资源
    最近更新 更多