Шаблон Стратегии хорошо работает, чтобы избежать огромных конструкций if ... else и облегчить добавление или замену функциональности. Тем не менее, это все еще оставляет один недостаток, на мой взгляд. Кажется, что в каждой реализации все еще должна быть ветвящаяся конструкция. Это может быть фабрика или файл данных. В качестве примера возьмем систему заказов.
Фабрика:
// All of these classes implement OrderStrategy
switch (orderType) {
case NEW_ORDER: return new NewOrder();
case CANCELLATION: return new Cancellation();
case RETURN: return new Return();
}
Код после этого не должен беспокоиться, и теперь есть только одно место для добавления нового типа заказа, но этот раздел кода по-прежнему не расширяем. Вытащив его в файл данных помогает читаемость несколько (спорно, я знаю):
<strategies>
<order type="NEW_ORDER">com.company.NewOrder</order>
<order type="CANCELLATION">com.company.Cancellation</order>
<order type="RETURN">com.company.Return</order>
</strategies>
Но это все еще добавляет стандартный код для обработки файла данных - предоставляется, легче тестируется на модуле и относительно стабильный код, но тем не менее дополнительная сложность.
Кроме того, этот вид конструкции плохо тестирует интеграцию. Каждую отдельную стратегию может быть проще тестировать, но каждая новая добавленная вами стратегия - сложность тестирования. Это меньше, чем если бы вы не использовали шаблон, но он все еще там.
Есть ли способ реализовать шаблон стратегии, который смягчает эту сложность? Или это настолько просто, насколько это возможно, и попытка пойти дальше будет только добавить еще один уровень абстракции для небольшой или бесполезной выгоды?
eval
... может не работать на Java, но может быть на других языках?