java - 具有操作传递的装饰器模式?

标签 java design-patterns

不确定这是否是装饰器模式的理想用途。这是设置。

我有一个 CommandBuilder 类,它有一个名为 build() 的操作方法。我想动态地将内容应用于此命令:将其写入文件、将其写入标准输出、将其写入日志文件。

它的布局是这样的:

public abstract class CommandBuilder {

   public abstract String build();

}

然后我有一个具体的实现

 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();

从而构建我的字符串命令并以各种方式输出它。

问题:由于我没有修改这些装饰器中的操作数据,而只是在将输出原封不动地传递给其他方法之前使用输出提供给其他方法,我是否在“滥用”该模式?有没有更好的方法来实现它?

最佳答案

这非常合适,除了 OutputDecorator 抽象类应该处理对 CommandBuilder 的引用(就像您在 FileDecorator 中所做的那样,而不与其他装饰器共享)

关于java - 具有操作传递的装饰器模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23920397/

相关文章:

java - 如何使我的 URL 仅为 "localhost:8080/*"?

java - Hibernate 按条件映射的一对多映射

java - For 循环检查玩家位置

c++ - 在 C++ 中让一个类完成工作还是将一个类分成几个子类?

rest - 微服务中 REST 的 URL 模式

java - Netty IO发送消息给客户端

java - 如何从java中的字符串数组中获取项目?

c# - 设计题: How to deal with initialization?

java - Android——谷歌对单例模式的矛盾

c++ - Boss-Worker模型设计