【发布时间】:2014-01-07 13:24:43
【问题描述】:
以下示例无耻地抄袭java.dzone.com,并根据我的需要进行了修改:
我们的界面:
public interface CompressionStrategy
{
public void compressFiles(ArrayList<File> files);
}
我们的第一个实现
public class GZipCompressionStrategy implements CompressionStrategy
{
public File compressFiles(ArrayList<File> files)
{
//using GZIP approach
return archive;
}
}
我们的第二次实施:
public class TarCompressionStrategy implements CompressionStrategy
{
public File compressFiles(ArrayList<File> 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<File> 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);
}
}
感觉很乱,因为:
- 我每次都必须重新设置策略
- 这两种策略可能兼容也可能不兼容(按此顺序,例如,对 GZipped 文件进行 Tar 是否有意义?)
- 原则上,创建第三个 TARGZipStrategy 类是可以的,但如果我们有 10 个策略允许每隔一个策略成为有效 XXXCombinedStrategy 方法的一部分,我们将有大约 35 个不同的类。
是否有一种巧妙的方法可以在此模式中任意顺序运行多个策略?例如,如果我想在最后创建一个.tar.gzip 文件?
我想说的是有没有巧妙的方法将两种策略组合在一起?
我觉得我正在做的事情应该有一些巧妙的解决方案,我不想重新发明轮子,同时我也不想过于依赖模式。
【问题讨论】:
-
你的意思是
decorator? -
您可能正在寻找装饰器模式或复合模式。
-
@JBNizet 复合策略?
-
@Pureferret:是的;如响应中显示的 JoinedCompressionStrategy 所示。
标签: java design-patterns strategy-pattern