Wzorzec strategii działa dobrze, aby uniknąć dużych, jeśli ... innych konstrukcji i ułatwić dodawanie lub zastępowanie funkcjonalności. Jednak moim zdaniem nadal ma to jedną wadę. Wygląda na to, że w każdej implementacji wciąż musi istnieć rozgałęziony konstrukt. Może to być plik fabryczny lub plik danych. Jako przykład weź system zamawiania.
Fabryka:
// All of these classes implement OrderStrategy
switch (orderType) {
case NEW_ORDER: return new NewOrder();
case CANCELLATION: return new Cancellation();
case RETURN: return new Return();
}
Kod po tym nie musi się martwić, a teraz jest tylko jedno miejsce, aby dodać nowy typ zamówienia, ale ta sekcja kodu wciąż nie jest rozszerzalna. Wyciągnięcie go do pliku danych nieco poprawia jego czytelność (dyskusyjne, wiem):
<strategies>
<order type="NEW_ORDER">com.company.NewOrder</order>
<order type="CANCELLATION">com.company.Cancellation</order>
<order type="RETURN">com.company.Return</order>
</strategies>
Ale to wciąż dodaje kod podstawowy do przetwarzania pliku danych - przyznany, łatwiejszy do testowania jednostkowego i stosunkowo stabilny kod, ale dodatkowa złożoność.
Ponadto tego rodzaju konstrukcja nie testuje dobrze integracji. Każda indywidualna strategia może być teraz łatwiejsza do przetestowania, ale każda nowa strategia, którą dodajesz, dodatkowo komplikuje testowanie. Jest mniej, niż byś zrobił, gdybyś nie użył wzoru, ale wciąż tam jest.
Czy istnieje sposób na wdrożenie wzorca strategii łagodzącego tę złożoność? A może jest to tak proste, jak to tylko możliwe, a próba posunięcia się do przodu dodałaby kolejną warstwę abstrakcji, która przyniosłaby niewiele korzyści?
eval
... może nie działać w Javie, ale może w innych językach?