Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这里真的需要装饰图案吗?_Java_Design Patterns - Fatal编程技术网

Java 这里真的需要装饰图案吗?

Java 这里真的需要装饰图案吗?,java,design-patterns,Java,Design Patterns,我正在学习的装饰设计模式从头第一设计模式书。他们的例子将不同类型的咖啡视为饮料。饮料用牛奶、大豆、奶油等装饰。例如,含有摩卡咖啡和奶油的暗室咖啡: 类图: 我知道这个例子之所以被使用是因为它很简单。但是,我有另一种更简单的方法来实现这个示例,而不使用decorator模式。我们可以有一个带有描述和成本的Item类。然后,饮料类可以有baseCost、totalCost和项目列表 与装饰图案相比,这种替代设计有什么主要缺点吗?你能给出装饰图案比我的设计更好的具体场景吗 PS-如果有人想看到装饰

我正在学习的装饰设计模式从头第一设计模式书。他们的例子将不同类型的咖啡视为饮料。饮料用牛奶、大豆、奶油等装饰。例如,含有摩卡咖啡和奶油的暗室咖啡:

类图:

我知道这个例子之所以被使用是因为它很简单。但是,我有另一种更简单的方法来实现这个示例,而不使用decorator模式。我们可以有一个带有描述和成本的Item类。然后,饮料类可以有baseCost、totalCost和项目列表

与装饰图案相比,这种替代设计有什么主要缺点吗?你能给出装饰图案比我的设计更好的具体场景吗


PS-如果有人想看到装饰师代码:

这里基本上是一种特定的饮料,由一个成分的链接列表表示。getDescription方法递归地构建饮料的字符串表示

在这个简单的例子中,它可能是好的,但是如果有很多成分,可能数量不同,另一个数据结构可能更好,可能是某种哈希表,但是还有很多其他的可能性

例如,这里的数量由重复的项目表示,因此没有分数,请参见StarbuzzCoffee.java中beverage2中的重复摩卡

您可以通过考虑管理另一个数据结构的开销和链表的简单性来决定哪种解决方案更好,请记住,如果链表中有许多项,尤其是当您需要随机访问元素时,链表可能会很昂贵。示例:您需要在循环中,其中n是列表大小,以检查饮料是否具有给定的成分,更不用说哈希表了。但是对于低n,使用哈希表的解决方案可能会慢一些,因为它是一个更复杂的数据结构

问题的答案取决于上下文,但一般来说,另一种方法没有错。

这主要取决于如何使用装饰图案

模式可能是一个复杂的主题,知道何时使用它们有时比理解如何使用它们更复杂

请参见“其他为Mat”,在其中向对象添加功能,例如颜色:

public class Mat extends ImageDecorator {
   String color;

   public Mat(String color, PhotoImage target) {
         super(target);
         this.color = color;
   }

   @Override
   public String getDescription() {
        return target.getDescription() + ", Matted(" + color + ")";
   } 
这是使用decorator模式添加功能而无需多重继承的主要原因

与静态多重继承相比,Decorator模式提供了一种更灵活的方式向对象添加职责


在本例中,在没有装饰器模式的情况下,可能会有相同的行为。我同意其他人已经说过的话。当然,这个例子只是为了学习如何与装饰师合作并识别模式

我想在这里补充一点,我是如何看待这个问题的。因为你说你在学习这个模式

当您使用decorator模式时,它可能只做一些其他实现。无论如何,好处是使用已知的模式,并且您有“一个词”来描述实现。通常,这在与团队合作时很重要,因为这样您就可以有效地描述实现细节。当其他开发人员也知道该模式时

当您使用自己的方式来实现行为时,通常需要时间来讨论它是如何工作的

第二个好处是decorator模式试图解决的问题

责任应该在运行时动态地添加到对象中并从中移除。 应提供扩展功能的子类化的灵活替代方案。
我之所以提到这一点,是因为在处理遗留代码/未知代码时,模式的使用非常有用。通常,您需要这种技巧来添加新行为而不修改原始实现。

90%的装饰器操作可以通过其他方式完成。这是一个易读性、可用性和抽象性的问题。列表引入了易变性,而Decorator模式允许运行时定制,同时保持不变。