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,不确定这是否是装饰图案的理想用途。这是设置 我有一个CommandBuilder类,它有一个名为build()的操作方法。我想对这个命令动态地应用一些东西:将它写入一个文件,将它写入stdout,将它写入一个日志文件 它的布局如下: public abstract class CommandBuilder { public abstract String build(); } 然后我有一个具体的IMP public class StringBuilder extends Comma

不确定这是否是装饰图案的理想用途。这是设置

我有一个CommandBuilder类,它有一个名为build()的操作方法。我想对这个命令动态地应用一些东西:将它写入一个文件,将它写入stdout,将它写入一个日志文件

它的布局如下:

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的代码。初始的
字符串
被创建,然后在装饰器中使用,但第一个生成的
字符串
的值不会在调用中修改。看起来像装饰器模式,但不确定是否确实是装饰器模式。看起来更像是责任链。