Czytelnicy tacy jak ty pomagają wspierać MUO. Kiedy dokonujesz zakupu za pomocą linków na naszej stronie, możemy otrzymać prowizję partnerską.

Wzorzec projektowy metody szablonu umożliwia zdefiniowanie kroków algorytmu w ramach pojedynczej metody klasy. Pozwala to ograniczyć określone operacje aplikacji do jednej metody.

Każdy krok algorytmu, który definiuje metoda szablonu, jest metodą wewnętrzną. Jednak metoda szablonu obsługuje tylko implementację niektórych jej metod wewnętrznych. Podklasy zwykle implementują jedną lub więcej wewnętrznych metod metody szablonowej.

Podklasa może zaimplementować metodę abstrakcyjną, ale nie może przedefiniować algorytmu zaimplementowanego metodą końcową.

Jak działa metoda szablonowa

Typowy wzorzec metody szablonowej będzie miał następującą strukturę:

finałpróżniametoda szablonu(){
abstrakcyjnaOperacja1();
abstrakcyjnaOperacja2();

konkretna operacja1();
konkretna operacja2();

hak();
}

Pierwszą ważną rzeczą, na którą należy zwrócić uwagę, jest to, że templateMethod() jest metodą ostateczną, więc żadna podklasa nie może zastąpić tej metody. Inną ważną rzeczą, na którą należy zwrócić uwagę, są trzy typy metod, z których korzysta wzorzec metody szablonowej: konkretna, abstrakcyjna i hakowa.

Klasa abstrakcyjna, w której znajduje się metoda szablonu, implementuje wszystkie jej konkretne metody, podczas gdy konkretne podklasy implementują jej metody abstrakcyjne. Metoda hook zwykle domyślnie nic nie robi, ale podklasa ma możliwość nadpisania tych metod, gdy jest to konieczne.

Implementacja wzorca metody szablonowej w Javie

Wzorzec metody szablonu działa jako struktura dla aplikacji. Tak więc często zobaczysz ten wzorzec w ramach oprogramowania, które zapewniają plan rozwoju aplikacji.

Na przykład możesz połączyć swoją aplikację z jednym z wielu systemów bazodanowych. Czynności związane z łączeniem się z bazą danych i korzystaniem z niej są zgodne z podobnym szablonem:

publicznyabstrakcyjnyklasaBaza danych{
// metoda szablonu
finałpróżniaszablon bazy danych(){
// metody abstrakcyjne
setDBDriver();
setCredentials();

// konkretna metoda
łączyć();

// metody abstrakcyjne
utwórzDB();
ustawDane();
odczytDane();

// metody haka
if (userWantsToUpdate()) {
Uaktualnij dane();
}

if (użytkownikWantsToDelete()) {
Usunąć dane();
}

// konkretna metoda
zamknijPołączenie();
}

abstrakcyjnypróżniaustaw sterownik DB();
abstrakcyjnypróżniaustaw dane uwierzytelniające();
abstrakcyjnypróżniautwórz DB();
abstrakcyjnypróżniaustaw dane();
abstrakcyjnypróżniaodczyt danych();
abstrakcyjnypróżniaUaktualnij dane();
abstrakcyjnypróżniaUsunąć dane();

próżniałączyć(){
System.out.println("Łączenie z bazą danych...");
}

próżniazamknijPołączenie(){
System.out.println("Niszczenie połączenia z bazą danych...");
}

logicznaużytkownik chce zaktualizować(){
powrótFAŁSZ;
}

logicznaużytkownik chce usunąć(){
powrótFAŁSZ;
}
}

Ta przykładowa klasa Database wykorzystuje wzorzec metody szablonu do utworzenia szablonu, którego można używać z dowolną bazą danych. Aby korzystać z bazy danych, aplikacja będzie musiała się z nią połączyć, a następnie zniszczyć połączenie po użyciu. Czynności te są zazwyczaj takie same dla wszystkich baz danych. W związku z tym abstrakcyjna klasa Database może zaimplementować łączyć() I closeConnection() metody.

Inne metody w metodzie szablonu będą się różnić w zależności od typu bazy danych. Na przykład baza danych MySQL przechowuje dane w tabelach, podczas gdy a Baza danych MongoDB przechowuje dane w kolekcjach. Jeśli chcesz użyć A Baza danych MySQL w Javie, po prostu utwórz nową klasę MySQL, która rozszerza klasę Database:

publicznyklasaMySQLrozciąga sięBaza danych{
@Nadpisanie
próżniaustaw sterownik DB(){
System.out.println("Wybieranie sterownika MySQL...");
}

@Nadpisanie
próżniaustaw dane uwierzytelniające(){
System.out.println("Ustawianie poświadczeń bazy danych MySQL...");
}

@Nadpisanie
próżniautwórz DB(){
System.out.println("Tworzenie nowej tabeli...");
}

@Nadpisanie
próżniaustaw dane(){
System.out.println("Wstawianie danych do bazy danych...");
}

@Nadpisanie
próżniaodczyt danych(){
System.out.println("Pobieranie danych z bazy danych...");
}

@Nadpisanie
próżniaUaktualnij dane(){
System.out.println("Aktualizowanie danych w bazie danych...");
}

@Nadpisanie
próżniaUsunąć dane(){
System.out.println("Usuwanie danych z bazy danych...");
}
}

Klasa MySQL implementuje wszystkie abstrakcyjne metody klasy Database. Może również zastąpić niektóre konkretne metody. Nie może jednak dotykać szablon bazy danych() Metoda, która używa słowa kluczowego final.

publicznyklasaGłówny{
publicznystatycznypróżniagłówny(String[] argumenty){
Baza danych mySQLDB = nowy MySQL();
mySQLDB.databaseTemplate();
}
}

Ta klasa Main tworzy nowy obiekt bazy danych MySQL i używa metody template do symulacji sposobu łączenia się aplikacji z bazą danych. Uruchomienie metody main powoduje wypisanie w konsoli następującego wyniku:

Na wyjściu zauważysz, że aplikacja nigdy nie wywołuje metody Uaktualnij dane() I Usunąć dane() metody. Dlatego ważne są metody hakowe. W bazie danych SQL będziesz chciał tworzyć nowe tabele, wstawiać dane i przeglądać dane. Możesz jednak nie chcieć aktualizować ani usuwać danych. Dlatego metody hook dają podklasom możliwość kontrolowania tych krytycznych aspektów algorytmu.

@Nadpisanie
logicznaużytkownik chce zaktualizować(){
powrótPRAWDA;
}

Po prostu dodając powyższy kod do klasy MySQL, aplikacja aktualizuje teraz dane w bazie danych. Jeśli ponownie uruchomisz klasę Main, wyświetli się następujący zaktualizowany wynik:

Jak widać, aplikacja aktualizuje teraz dane w Bazie Danych.

Korzyści z używania wzorca projektowego metody szablonowej

Główną zaletą wzorca metody szablonowej jest to, że promuje on ponowne użycie oprogramowania. Ten wzorzec projektowy obsługuje również wydajne programowanie. Podklasa musi tylko zaimplementować metody, które są unikalne dla jej działania.

Dodatkowo aplikacja korzystająca ze wzorca metody szablonowej jest bezpieczniejsza, ponieważ klasy zewnętrzne nie mogą zmieniać jej struktury działania.