以下示例无耻地从java.dzone.com中删除,并根据我的需要进行了修改:
我们的界面:
public interface CompressionStrategy { public void compressFiles(ArrayListfiles); }
我们的第一次实施
public class GZipCompressionStrategy implements CompressionStrategy { public File compressFiles(ArrayListfiles) { //using GZIP approach return archive; } }
第二次实施:
public class TarCompressionStrategy implements CompressionStrategy { public File compressFiles(ArrayListfiles) { //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(ArrayListfiles) { 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
在最后创建一个文件?
我想说的是将两种策略合二为一的巧妙方法?
我觉得我正在做的事情应该有一些简洁的解决方案,我不想重新发明轮子,同时我也不想过于依赖模式.
你可以创建一个 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)); } }