代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

对于实现咖啡订购系统来说,装饰图案是否太多?

  •  1
  • nonopolarity  · 技术社区  · 15 年前

    更新: 因为我们通常会说,“情况将决定任何设计模式是否适合该工作”…现实生活中的咖啡订购系统是否可以用装饰图案来解决?

    对于实现咖啡订购系统来说,装饰图案是否太多?head-first设计模式书将其用作示例,但我认为我将仅使用2个数组或表来实现它:

    咖啡类型(用于法国烤肉、室内混合等)
    添加(焦糖、奶油、肉桂等)

    所以它可以是prices.php中的2个数组,或者是db中的2个表,并读取到2个数组中。

    当顾客点咖啡时,这些选择就会把价格加起来。

    看起来使用decorator模式太过分了,或者您认为有充分的理由实际使用这个模式吗?作为一个例子,我认为这很好,但是如果它看起来像一个现实生活中的问题,用一种简单的方式完全可以解决,但是用一个更复杂的解决方案来代替,那也会让人觉得很奇怪。

    4 回复  |  直到 15 年前
        1
  •  5
  •   workmad3    15 年前

    这是一个典型的高级抽象示例问题。这个例子必须足够简单,以便于理解和演示概念,这也意味着对于许多设计模式来说,它也更容易以另一种方式实现。

    也就是说,我通常看到的装饰师描述的方式是在窗口系统中。您有一个标准窗口,希望允许水平和垂直滚动窗口。您可以为窗口子类化所有可能的变化,或者您可以提供一个水平滚动条装饰器和一个垂直滚动条装饰器来执行该任务,并具有附加的好处,这样您就可以装饰其他控件,而不必再子类化更多。这(对我来说)是一个非常有效的装饰师的使用方法,它可以传达各种想法,但要为其提供示例代码则要困难得多。

        2
  •  2
  •   gub    15 年前

    问题是,对于“这真的会是吗”没有特别的答案。取决于程序员。编写简短示例的人可以想出他们喜欢的任何模式,但是只有当您知道系统的其余部分时,您才能决定结构。

    我相信当你给 名称 它变成了 事情 你必须学习,就像 梯形法则 -我认为这实际上是常识,你知道这个领域。不要把装饰图案看作是一种工具,它只是实现所需功能的一种方法。如果一个counter类包装一个整数,那是一个装饰模式,还是我们不关心?

    ID以您能想到的最合理的方式对其进行编码,使用设计模式作为指导/想法。试着忘记他们的名字-让学习模式改善你的编程。(但在面谈前再看看他们!)

        3
  •  0
  •   Kekoa    15 年前

    他们试图教授这个概念,而不是如何创建一个咖啡订购系统。使用的装饰器模式是更复杂的情况,如用户界面。

    可以在JavaIO系统等地方使用装饰器模式。BufferedReader是一个阅读器的修饰器。

    这种模式非常有用,在某些地方它会找到很好的用途。

        4
  •  0
  •   Jayson    15 年前

    像其他人提到的那样,在一本书所需要的一个简单的例子中,正在被解释的原则可能会有点丢失,但是在现实世界中,当您编程更大更复杂的系统时,模式将是维护性的更好选择。

    我认为您在示例中遗漏的一点是,装饰器模式是关于添加行为的。在头一个例子中,行为是计算成本。

    假设类是按照您描述的方式实现的,使用数组,然后合计成本。没关系,你可以这样做,加上咖啡和配料的总成本。但是,现在说政府对咖啡征收重税,因为他们认为咖啡因对你有害,他们希望人们少喝。现在,你打算如何在饮料中增加税收计算?您肯定不想修改原始类,因为这将违反打开/关闭原则。你也可以扩大课程范围,增加行为,但这意味着你可能需要扩大课程范围,让你的商店里所有含有咖啡因的食品/饮料都可以使用。这会变得一团糟,你可能会有很多类需要扩展。最后一个选项是使用decorator模式,并动态地将纳税计算行为添加到您想要的任何内容中。这将在不违反开放/关闭原则的情况下解决问题,或者是扩展可能几十个类的噩梦。

    这就是装饰图案的意义所在。