Класс стратегии применяется в зависимости от выполнения определенного условия.Стратегия «выбрана» как бы.Шаблон стратегии 101.
Но что, если существует группа классов, которые все применяются на основе одного и того же условия.Концептуально, вы можете указать на группу классов и назвать всю группу стратегией, но это отношение не является явным и, более того, логика внутри этих классов точно изолирована, поэтому они не знают друг друга.Они просто вызывают одно и то же условие.
Пример:
public interface BookValidator {
enum PublishType { PAPER_BACK, HARD_COVER, EPUB }
PublishType validationFor();
boolean validate(Book book);
}
class HardcoverBookBindingValidator implements BookValidator {
public PublishType validationFor() { return PublishType.HARD_COVER; }
public boolean validate(Book book) { /* perform validation */ }
}
class HardCoverPaperqualityValidator implements BookValidator {
public PublishType validationFor() { return PublishType.HARD_COVER; }
public boolean validate(Book book) { /* perform validation */ }
}
class EpubSectionsValidator implements BookValidator {
public PublishType validationFor() { return PublishType.EPUB; }
public boolean validate(Book book) { /* perform validation */ }
}
class EpubIndexValidator implements BookValidator {
public PublishType validationFor() { return PublishType.EPUB; }
public boolean validate(Book book) { /* perform validation */ }
}
// etc.
public boolean validateBook(Book book) {
for (BookValidator validator: allBookValidators) {
if (validator.validationFor() == book.type() && !validator.validate(book)) {
return false;
}
}
return true;
}
Я часто вижу такой подход, есть ли название для этого?Я склоняюсь к шаблону стратегии с простым разделением проблем (SRP, высокая сплоченность), но я не уверен.
Распространенный аналогичный подход, использующий Spring специально, заключается в том, чтобы иметь супер тип длявсе типы публикации и затем Spring вставляет их в коллекции для каждого типа.В основном прославленная фабрика.Суть в том, что нет единого объекта стратегии, если только вы не подсчитываете совокупность объектов для определенного типа стратегии.