Я пытаюсь понять шаблон стратегии и спрашиваю себя: должен ли быть контекстный класс или я могу оставить его без компромисса с целью шаблона?
У меня сложилось впечатление, что мне нужен какой-то переключатель для чтения разных типов файлов, но я не хотел просто что-то взламывать, а потом заниматься рефакторингом (хотя, конечно, всегда бывает, что код можно реорганизовать, но идея была в следующем: try быть максимально умным в дизайне заранее ...)
Изображение взято из Викимедиа
Может ли клиент делегировать напрямую интерфейсу Стратегии, или я что-то упустил, чтобы понять о классе контекста?
interface Reader {
// read information from file and fill data list field of Client
readFile();
}
class ExcelReader implements Reader{ /* */ }
class PdfReader implements Reader{ /* */}
class Client{
// strategic choice
Reader r;
// data list field
List<Data> data;
// Client Constructor
public Client(){
if(<file ends in .xls>)
r = new ExcelReader();
else
r = new PdfReader();
r.readFile();
}
}
Итак, на рисунке выше отсутствует контекстный класс. Код придерживается шаблона стратегии?
design-patterns
strategy
Panny
источник
источник
Ответы:
В вашем примере вызов кода
readFile
является частью конструктора Client. Этот метод является "контекстом", который вы ищете . Шаблон стратегии не нуждается буквально в «классе контекста», и в первой версии вашего кода объект стратегии (в вашем случае «Reader») может находиться только в локальной переменной. Особенно, когда нужно вызвать только один «стратегический метод» («readFile»).Однако, если ваша кодовая база растет от одной версии к другой, не исключено, что все больше и больше «стратегических» методов будут вызываться, и решение о том, какую стратегию применять, и выполнение «стратегических методов» будет происходить в разное время. и в разных местах в вашем коде. Таким образом, вы начинаете рефакторинг их, чтобы сохранить логику в одном месте. Это сразу приведет к реализации, похожей на диаграмму в вашем вопросе.
источник
Безусловно. Шаблоны - это просто рекомендации. Вам все равно нужно будет адаптировать и правильно применять их для решения проблемы. Лично я редко позволяю устанавливать стратегию во время выполнения; чаще это указывается на стройке или раскручивается на фабрике.
Хотя можно также утверждать, что
setStrategy
это личное, и моя инъекция просто использует шаблон, как показано.источник