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