You probably are looking for a decorator pattern implementation instead. The intent of this pattern is to add additional responsibilities dynamically to an object. Tradeoff is that you'll get a explossion of subclasses too.
Example with code:
The common interface.
public interface CompressionStrategy{
File compressFiles(List<File> files);
}
the base compression for all files.
public class CompressionBase implements CompressionStrategy{
@Override
public File compressFiles(List<File> files)) {
//return default compression
}
}
The decorator abstract class
public abstract class AbstractCompressionDecorator implements CompressionStrategy{
private final CompressionStrategy decoratee;
/**
* @param decoratee
*/
public AbstractCompressionDecorator(CompressionStrategy decoratee) {
super();
this.decoratee = decoratee;
}
@Override
public File compressFiles(List<File> files) {
File file = decoratee.compressFiles(files);
return compressFilesToAnotherFormat(file);
}
protected abstract File compressFilesToAnotherFormat(File file);
}
and the decorators concrete classes.
public class TarCompression extends AbstractCompressionDecorator {
public TarCompression (CompressionStrategy compressionStrategy) {
super(compressionStrategy);
}
@Override
protected File compressFilesToAnotherFormat(File file) {
// tar compression logic here;
}
}
Zip compression
public class ZipCompression extends AbstractCompressionDecorator {
public ZipCompression (CompressionStrategy compressionStrategy) {
super(compressionStrategy);
}
@Override
protected File compressFilesToAnotherFormat(File file) {
// zip compression logic here;
}
and a simple Factory to create objects
public final class CompressionFactory {
private CompressionFactory (){}
public static CompressionStrategy create(String extension){
CompressionStrategy compressionStrategy = new CompressionBase();
if(extension.contains("zip")){
compressionStrategy = new ZipCompression(compressionStrategy);
}else if(extension.contains("tar.gzip")){
compressionStrategy = new TarCompression(new GzipCompression(compressionStrategy));
}
return compressionStrategy ;
}
}
then in client code you only have to write this.
CompressionStrategy compressionStrategy = CompressionFactory.create("tar.gzip");
File file = compressionStrategy.compressFiles(files);