结合Java策略模式中的策略

 一生的牵扯 发布于 2023-02-06 08:06

以下示例无耻地从java.dzone.com中删除,并根据我的需要进行了修改:

我们的界面:

public interface CompressionStrategy
{
  public void compressFiles(ArrayList files);
}

我们的第一次实施

public class GZipCompressionStrategy implements CompressionStrategy
{

   public File compressFiles(ArrayList files)
   {
     //using GZIP approach
     return archive;
   }

}

第二次实施:

public class TarCompressionStrategy implements CompressionStrategy
{

   public File compressFiles(ArrayList files)
   {
     //using TAR approach
     return archive;
   }

}

这是给出的用途:

public class CompressionContext
{
   private CompressionStrategy strategy;   

   //this can be set at runtime by the application preferences
   public void setCompressionStrategy(CompressionStrategy strategy) 
   {
       this.strategy = strategy;  
   }

  //use the strategy
   public File createArchive(ArrayList files) 
   {
        strategy.compressFiles(files);
   }

}

使用Main方法的客户端类

public class Client
{

   public static void main(String[] args)
   {
      CompressionContext ctx = new CompressionContext(); 
      File archive;
     //we could assume context is already set by preferences 
      ctx.setCompressionStrategy(new TarCompressionStrategy());     
     //get a list of files 
    ...
     archive = ctx.createArchive(fileList);    
     ctx. setCompressionStrategy(new GZipCompressionStrategy());
     archive = ctx.createArchive(archive);         
   }
}

哪个感觉很乱,因为:

    我每次都要重置策略

    这两种策略可能兼容也可能不兼容(按此顺序,例如Tar对GZipped文件有意义吗?)

    原则上创建第三个TARGZipStrategy类是正常的,但是如果我们有10个策略允许每个其他类策略成为有效的XXXCombinedStrategy方法的一部分,那么我们将有~35个不同的类.

有没有一种巧妙的方法可以在这种模式中按顺序任意运行多个策略?例如,如果我想.tar.gzip在最后创建一个文件?

我想说的是将两种策略合二为一的巧妙方法?

我觉得我正在做的事情应该有一些简洁的解决方案,我不想重新发明轮子,同时我也不想过于依赖模式.

1 个回答
  • 你可以创建一个 JoinedCompressionStrategy

    class JoinedCompressionStrategy implements CompressionStrategy {
    
        private final CompressionStrategy s0;
        private final CompressionStrategy s1;
    
        public JoinedCompressionStrategy(CompressionStrategy s0, CompressionStrategy s1) {
            this.s0 = s0;
            this.s1 = s1;
        }
    
        public File compressFiles(ArrayList<File> files) {
            File archive = s0.compressFiles(files);
            return s1.compressFiles(Arrays.asList(archive));
        }
    }
    

    2023-02-06 08:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有