Implementacija uzorka metode predloška u Javi

1. Pregled

U ovom brzom vodiču vidjet ćemo kako iskoristiti obrazac metode predloška - jedan od najpopularnijih uzoraka GoF-a.

Olakšava implementaciju složenih algoritama enkapsulacijom logike u jednu metodu.

2. Provedba

Da bismo demonstrirali kako funkcionira obrazac metode predloška, ​​stvorimo jednostavan primjer koji predstavlja izgradnju računalne stanice.

S obzirom na definiciju uzorka, struktura algoritma bit će definirana u osnovnoj klasi koja definira predložak izgraditi() metoda:

javna apstraktna klasa ComputerBuilder {// ... javna završna računala buildComputer () {addMotherboard (); setupMotherboard (); addProcessor (); vratiti novo računalo (computerParts); } javna sažetak void addMotherboard (); javna apstraktna praznina setupMotherboard (); javna sažetak void addProcessor (); // ...}

The ComputerBuilder class odgovoran je za iznošenje koraka potrebnih za izgradnju računala deklariranjem metoda za dodavanje i postavljanje različitih komponenata, poput matične ploče i procesora.

Ovdje, the izgraditi() metoda je metoda predloška, koji definira korake algoritma za sastavljanje dijelova računala i vraća potpuno inicijalizirane Računalo instance.

Primijetite da iproglašeno je kao konačni kako bi se spriječilo njegovo nadjačavanje.

3. Na djelu

Kad je osnovna klasa već postavljena, pokušajmo je koristiti stvaranjem dvije potklase. Jedno koje izrađuje „standardno“ računalo, a drugo koje izrađuje „vrhunsko“ računalo:

javna klasa StandardComputerBuilder proširuje ComputerBuilder {@Override public void addMotherboard () {computerParts.put ("Matična ploča", "Standardna matična ploča"); } @Override public void setupMotherboard () {motherboardSetupStatus.add ("Privijanje standardne matične ploče na kućište."); motherboardSetupStatus.add ("Uključivanje konektora za napajanje."); motherboardSetupStatus.forEach (korak -> System.out.println (korak)); } @Override public void addProcessor () {computerParts.put ("Procesor", "Standardni procesor"); }}

I ovdje je HighEndComputerBuilder varijanta:

javna klasa HighEndComputerBuilder proširuje ComputerBuilder {@Override public void addMotherboard () {computerParts.put ("Matična ploča", "Vrhunska matična ploča"); } @Override public void setupMotherboard () {motherboardSetupStatus.add ("Privijanje vrhunske matične ploče na kućište."); motherboardSetupStatus.add ("Uključivanje konektora za napajanje."); motherboardSetupStatus.forEach (korak -> System.out.println (korak)); } @Override public void addProcessor () {computerParts.put ("Procesor", "Vrhunski procesor"); }}

Kao što vidimo, nismo se trebali brinuti o cijelom procesu montaže, već samo o pružanju implementacija za zasebne metode.

Pogledajmo sada na djelu:

novi StandardComputerBuilder () .buildComputer (); .getComputerParts () .forEach ((k, v) -> System.out.println ("Dio:" + k + "Vrijednost:" + v)); novi HighEndComputerBuilder () .buildComputer (); .getComputerParts () .forEach ((k, v) -> System.out.println ("Dio:" + k + "Vrijednost:" + v));

4. Metode predloška u osnovnim knjižnicama Java

Ovaj se obrazac naširoko koristi u osnovnim knjižnicama Java, na primjer java.util.AbstractList ili java.util.AbstractSet.

Na primjer, Sažetak popisa pruža skeletnu provedbu Popis sučelje.

Primjer metode predloška može biti Dodaj Sve() metoda, iako nije izričito definirana kao završni:

javni logički addAll (int indeks, Zbirka c) {rangeCheckForAdd (indeks); logička promjena = netačno; za (E e: c) {dodati (indeks ++, e); izmijenjeno = točno; } povratak izmijenjen; }

Korisnici trebaju samo implementirati dodati() metoda:

public void add (int index, E element) {throw new UnsupportedOperationException (); }

Ovdje je odgovornost programera osigurati implementaciju za dodavanje elementa na popis s danim indeksom (varijantni dio algoritma uvrštavanja).

5. Zaključak

U ovom smo članku prikazali obrazac metode predloška i kako ga implementirati u Javi.

Uzorak metode predloška potiče ponovnu upotrebu i razdvajanje koda, ali na štetu korištenja nasljeđivanja.

Kao i uvijek, svi uzorci koda prikazani u ovom članku dostupni su na GitHubu.