Шаблон стратегії добре працює, щоб уникнути величезного, якщо ... інше будує та полегшує додавання або заміну функціональності. Однак це все ще залишає один недолік на мою думку. Схоже, що в кожній реалізації все ще має бути розгалужена конструкція. Це може бути фабрика або файл даних. Як приклад візьміть систему замовлення.
Завод:
// 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, але, можливо, іншими мовами?