Java 操作通过的装饰器模式?
不确定这是否是装饰图案的理想用途。这是设置 我有一个CommandBuilder类,它有一个名为build()的操作方法。我想对这个命令动态地应用一些东西:将它写入一个文件,将它写入stdout,将它写入一个日志文件 它的布局如下:Java 操作通过的装饰器模式?,java,design-patterns,Java,Design Patterns,不确定这是否是装饰图案的理想用途。这是设置 我有一个CommandBuilder类,它有一个名为build()的操作方法。我想对这个命令动态地应用一些东西:将它写入一个文件,将它写入stdout,将它写入一个日志文件 它的布局如下: public abstract class CommandBuilder { public abstract String build(); } 然后我有一个具体的IMP public class StringBuilder extends Comma
public abstract class CommandBuilder {
public abstract String build();
}
然后我有一个具体的IMP
public class StringBuilder extends CommandBuilder {
...
public String build() {
... builds command string ....
return commandString;
}
}
抽象装饰师:
public abstract class OutputDecorator extends CommandBuilder {
public abstract String build();
}
最后,装饰师自己:
public class FileDecorator extends OutputDecorator {
CommandBuilder builder;
public FileDecorator(CommandBuilder builder) {
this.builder = builder;
}
public String build() {
String commandOutput = builder.build(); // call it
...
someWriteClass.writeFile(commandOutput); // use it
return commandOutput; // pass it along unchanged;
}
}
等等,对于StandardOutputDecorator,LoggerOutputDecorator
然后在使用中:
CommandBuilder mybuilder = new LoggerOutputDecator(
new StandardOutputDecorator(
new FileDecorator(
new StringCommandBuilder()
)
)
);
mybuilder.build();
从而构建我的string命令并以各种方式输出它
问:由于我没有修改这些装饰器中的操作数据,而是在将其原封不动地传递给其他方法之前,使用输出来输入其他方法,所以我是否“误用”了该模式?有更好的实现方法吗?这非常合适,除了OutputDecorator抽象类应该处理对CommandBuilder的引用(就像您在FileDecorator中所做的那样,不与其他装饰器共享)首先,我建议您检查桥接设计模式。您应该有一个用于处理数据的层次结构(打印到文件、控制台等),以及另一个用于数据构建器的层次结构-它们应该是松散耦合的,因为作为最佳实践,类必须是一致的和装箱的,因为一个原因 此外,我们使用Decorator模式来扩展类的默认行为。FileDecorator、LoggerOutputDecator类有自己的职责,它们不扩展“修饰”对象的默认行为 我认为您应该有前面提到的两个不同的层次结构,但是数据处理程序的层次结构不应该以数据方式实现(不要使用Decorator模式,因为它们不会修饰任何东西)
我认为使用构建器构建数据并在处理程序上迭代会更干净。应该调用每个处理程序,并且生成器生成的数据应该作为参数传递。我不确定,因为您没有向结果添加任何行为。@LuiggiMendoza结果不仅是返回值,而且是被调用方法的任何副作用。对我来说,它似乎是一个经典的包装器/装饰器。@pingw33n阅读OP的代码。初始的
字符串
被创建,然后在装饰器中使用,但第一个生成的字符串
的值不会在调用中修改。看起来像装饰器模式,但不确定是否确实是装饰器模式。看起来更像是责任链。