Posiadam klasę użytkową, która wykonuje pewną pracę. Oczywiście jest on zamknięty dla rozszerzenia i wszystkie metody są statyczne. Dla uproszczenia, klasy wygląda następująco:Metoda szablonowa dla klas statycznych
public final class Util {
private Util() { }
public static void doWork() {
// some work
int variable = help();
// some work uses variable
}
private static int help() {
// some helper functionality
}
}
klasa ma metodę doWork
który wykonuje wiele obliczeń. Nawiasem mówiąc, metoda wywołuje metodę pomocniczą help
, aby uzyskać wynik, a reszta kodu korzysta z wyniku zwróconego przez metodę help
.
Teraz w kodzie klienta chcę ponownie użyć funkcji metody doWork
, ale zamiast wywoływania help
chcę wywołać metodę help2
. Najprostszym rozwiązaniem jest po prostu utworzenie metody doWork2
z zastępowaniem help
na help2
.
Jest to bardzo złe podejście, ponieważ każda zmiana w doWork
musi być również replikowana w doWork2
. Jest to bardzo podobne do wzoru Template Method
, ale z tego powodu, że nie mamy tu rozszerzenia, nie możemy go zastosować.
Najlepsze rozwiązanie wymyśliłem, aby dodać parametr do tej metody, ale zachować wszystkie istniejące użytkownikom doWork
:
public static void doWork() {
doWorkWithParameter(true);
}
public static void doWorkWithParameter(boolean helpOrHelp2) {
// some work
int variable = helpOrHelp2 ? help() : help2();
// some work uses variable
}
Jakie są lepsze rozwiązania projektowe mogą być stosowane, aby rozwiązać ten problem? Czy istnieje sposób na osiągnięcie elastyczności, takiej jak Template Pattern
, ale w aplikacji do wykorzystania klas.
Z góry dziękuję.
Czy istnieje jakikolwiek powód, aby nie używać przeciążenie metody w roztworze? 'public static void doWork() {...}' 'public static void doWork (boolean param) {...}' – Crazenezz
Albo jeszcze lepiej 'public static void doWork (int variable)'. Chociaż podejrzewam, że rzeczywista odpowiedź jest taka, że pomyłki wynikają ze statyki i że obiekty dostarczają czystszą odpowiedź - trudną do określenia przy pomocy abstrakcyjnych przykładów. –
To, czego szukasz, to wzór strategii. Sprawdź odpowiedź Arnalda. –