Java 装饰器模式-添加接口中未定义的功能

Java 装饰器模式-添加接口中未定义的功能,java,decorator,Java,Decorator,在使用这种模式时是否有任何硬性规定,或者仅仅是为了在方法调用中实现附加功能而不使用继承 我已经修改了我从SO帖子中摘取的下面的示例,以展示我正在考虑的内容 public interface Coffee { public double getCost(); public String getIngredients(); } public class SimpleCoffee implements Coffee { @Override public double

在使用这种模式时是否有任何硬性规定,或者仅仅是为了在方法调用中实现附加功能而不使用继承

我已经修改了我从SO帖子中摘取的下面的示例,以展示我正在考虑的内容

 public interface Coffee {
     public double getCost();
     public String getIngredients();
 }
public class SimpleCoffee implements Coffee {
   @Override
   public double getCost() {
    return 1;
   }
   @Override
   public String getIngredients() {
    return "Coffee";
   }
}

 public class CoffeeDecorator implements Coffee {
   protected final Coffee decoratedCoffee;

   public CoffeeDecorator(Coffee c) {
    this.decoratedCoffee = c;
   }
   @Override
   public double getCost() { 
    //you can add  extra functionality here.
    return decoratedCoffee.getCost();
  }
   @Override
   public String getIngredients() {
    //you can add  extra functionality here.
    return decoratedCoffee.getIngredients();
   }

   public boolean methodNotDefinedInInterface() {
       //do something else
       return true;
   }
}
因此,考虑到上述示例,是否可行:

a) 只要你觉得合适,就用简单的咖啡,不要装饰它

b) 将Coffee接口中未定义的其他功能添加到装饰器对象,例如
MethodNotDefinedInterface()

有人能解释一下这种组合是从哪里来的吗?
SimpleCoffee
本身就可以存在,但它似乎是实际“拥有”任何对象的装饰者

虽然没有
SimpleCoffee
类(或
Coffee
的一些具体实现),装饰器没有任何用途,因此聚合似乎不是这里发生的事情。

包含的意图非常清楚地说明了模式的用途:

decorator模式可以用于静态地扩展(装饰)某个对象的功能,或者在某些情况下在运行时独立于同一类的其他实例,前提是在设计时做了一些基础工作

至于“硬性规定”——我通常认为模式中根本没有“硬性规定”。比如,如果你不完全按照GoF描述的那样实施,就不会有“模式警察”惩罚你。唯一的一点是,如果您遵循经典的指导原则,其他开发人员在识别代码中的模式时会遇到较少的问题

在我看来,你的例子很好

SimpleCoffee
不是装饰师,因此没有构图
CoffeedEconator
装饰咖啡
作为一个组件(这里是您的组合)

其中包含的意图非常清楚该模式的用途:

decorator模式可以用于静态地扩展(装饰)某个对象的功能,或者在某些情况下在运行时独立于同一类的其他实例,前提是在设计时做了一些基础工作

至于“硬性规定”——我通常认为模式中根本没有“硬性规定”。比如,如果你不完全按照GoF描述的那样实施,就不会有“模式警察”惩罚你。唯一的一点是,如果您遵循经典的指导原则,其他开发人员在识别代码中的模式时会遇到较少的问题

在我看来,你的例子很好

SimpleCoffee
不是装饰师,因此没有构图
CoffeedEconator
装饰咖啡
作为一个组件(这里有您的组成部分)

a) 只要你觉得合适,就用简单的咖啡,不要装饰它

当然可以

b) 添加咖啡中未定义的其他功能 装饰器对象的接口,例如 MethodNotDefinedInterface()

您可以添加更多方法,就像向
SimpleCoffee
类添加新方法一样,但请注意,您需要在decorator类中的某个位置使用这些附加方法


就我个人而言,当有人给你一个
Coffee
的实例时,我发现这个模式很有用(即,你没有实例化它)。如果需要在运行时更改其行为,唯一的方法是将其包装到另一个
Coffee
类型的对象中。这时,您可以将其放入decorator类。装饰者可以在提供一些新行为的同时公开一些原始行为

a) 只要你觉得合适,就用简单的咖啡,不要装饰它

当然可以

b) 添加咖啡中未定义的其他功能 装饰器对象的接口,例如 MethodNotDefinedInterface()

您可以添加更多方法,就像向
SimpleCoffee
类添加新方法一样,但请注意,您需要在decorator类中的某个位置使用这些附加方法



就我个人而言,当有人给你一个
Coffee
的实例时,我发现这个模式很有用(即,你没有实例化它)。如果需要在运行时更改其行为,唯一的方法是将其包装到另一个
Coffee
类型的对象中。这时,您可以将其放入decorator类。装饰师可以在提供一些新行为的同时暴露一些原始行为。

这并不是直接回答您的问题,而是密切相关这并不是直接回答您的问题,而是密切相关的哈哈哈谢谢!你对“模式警察”的评论让我发笑,他们可能不是一个真正的单位,但我相信每个组织都有几个自封的成员!答案很好,我从我提供的一个基本示例中得出,经典的指导原则仍然得到遵守?你发布的描述说“可以使用……”我想这足以说明它不必以这种方式使用。干杯@贝林布洛我现在在电台头上播放了“模式警察”的旋律。哈哈哈,谢谢!你对“模式警察”的评论让我发笑,他们可能不是一个真正的单位,但我相信每个组织都有几个自封的成员!答案很好,我从我提供的一个基本示例中得出,经典的指导原则仍然得到遵守?你发布的描述说“可以使用……”我想这足以说明它不必以这种方式使用。干杯@berimbolo我现在在脑海中播放着电台头条“Karma police”旋律中的“Pattern police”。好的,谢谢,也许我的用例根本不适合。我正在对一组难以理解的类进行重构,其中包含了多层Ab