gpt4 book ai didi

java - 在 Java 策略模式中组合策略

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:52:57 26 4
gpt4 key购买 nike

下面的例子无耻地抄袭了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);
}
}

这感觉很乱,因为:

  1. 我每次都必须重新设置策略
  2. 这两种策略可能兼容也可能不兼容(按此顺序,例如,对 GZip 文件进行 Tar 处理有意义吗?)
  3. 原则上可以创建第三个 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));
}
}

关于java - 在 Java 策略模式中组合策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20972801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com