Примеры ниже бесстыдно сорваны из java.dzone.com, и изменены в соответствии с моим потребностям:Комбинирование Стратегии в шаблон Java стратегии
Наш интерфейс:
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);
}
}
Client класса с основным методом
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
в конце?
Что я пытаюсь сказать, есть ли аккуратный способ объединить две стратегии вместе в одну?
Я чувствую, что то, что я делаю, должно иметь некоторое опрятное решение, и я не хочу изобретать велосипед, и в то же время я не хочу становиться слишком зависимым от моделей.
Вы имеете в виду «декоратор»? – nachokk
Возможно, вы ищете шаблон декоратора или составной узор. –
@JBНайти составную стратегию? – Pureferret