Java Academy · Oppitunti

Template Method: algoritmien rungot

Määritä algoritmin runko kantaluokassa ja anna aliluokkien täyttää sen vaiheet.

Oppitunti 4/414 vaihetta

Template Method: algoritmien rungot on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Template Method -kuvion tarkoitus

Template Method määrittelee algoritmin rungon perusluokassa ja jättää osan vaiheista aliluokkien toteutettaviksi. Aliluokat voivat korvata vaiheita muuttamatta kokonaisrakennetta.

Abstrakti perusluokka

Perusluokassa on template-metodi, joka on yleensä final ja ohjaa vaiheiden suorittamista. Abstraktit metodit edustavat vaihtelevia vaiheita. Konkreettiset metodit tarjoavat oletustoiminnan.

public abstract class DataProcessor {
    // Template method — final, defines the algorithm
    public final void process() {
        readData();
        processData();
        writeResult();
    }
    protected abstract void readData();
    protected abstract void processData();
    protected void writeResult() {
        System.out.println("Result written (default)");
    }
}

Konkreettiset aliluokat

Kukin aliluokka toteuttaa abstraktit vaiheet. Template-metodin järjestys ei koskaan muutu — vain yksittäisten vaiheiden toteutukset vaihtelevat.

public class CSVProcessor extends DataProcessor {
    protected void readData()    { System.out.println("Reading CSV..."); }
    protected void processData() { System.out.println("Parsing CSV rows..."); }
}
public class XMLProcessor extends DataProcessor {
    protected void readData()    { System.out.println("Reading XML..."); }
    protected void processData() { System.out.println("Parsing XML nodes..."); }
    @Override
    protected void writeResult() { System.out.println("Writing XML result."); }
}

Hook-metodit

Hook on valinnainen vaihe, jolla on oletustoteutus, usein tyhjä. Aliluokat voivat korvata hook-metodeja lisätäkseen valinnaista toimintaa ilman, että niiden on pakko toteuttaa sitä.

public abstract class Game {
    public final void play() {
        initialize();
        while (!isDone()) takeTurn();
        printWinner();
    }
    protected void initialize() {}  // hook — optional override
    protected abstract boolean isDone();
    protected abstract void takeTurn();
    protected abstract void printWinner();
}

Template Method ja Strategy

Template Method käyttää perintää: runko on kiinteä perusluokassa ja vaiheet korvataan aliluokissa. Strategy käyttää koostamista: koko algoritmi on perusluokan ulkopuolella. Strategy on joustavampi, kun taas Template Method on yksinkertaisempi, jos vaiheet jakavat paljon kontekstia.

Javan InputStream Template Methodina

java.io.InputStream-luokan read(byte[], int, int) on toteutettu abstraktin read()-metodin avulla. Aliluokat toteuttavat yhden tavun version, ja usean tavun luku toimii templaattina.

Template Method raporttien tuottamiseen

Määritelkää raporttitemplaatti: kerätkää tiedot, muotoilkaa ne ja tulostakaa ne. Vaihtakaa aliluokkia PDF-, HTML- tai CSV-tulostusta varten muuttamatta koordinointilogiikkaa.

public abstract class ReportGenerator {
    public final String generate() {
        List<Record> data = fetchData();
        String body = format(data);
        return wrap(body);
    }
    protected abstract List<Record> fetchData();
    protected abstract String format(List<Record> data);
    protected String wrap(String body) { return body; } // hook
}

Templaatin ylikirjoituksen estäminen

Merkitkää template-metodi määreellä final, jotta aliluokat eivät voi muuttaa algoritmin rakennetta. Vain hook- ja abstraktit metodit saavat olla ylikirjoitettavissa.

public final void process() {
    validate(); // abstract
    execute();  // abstract
    cleanup();  // hook with default
}

Abstraktit ja konkreettiset vaiheet

Tehkää vaiheesta abstrakti, kun aliluokan on toteutettava se. Tehkää siitä konkreettinen, mahdollisesti tyhjä, kun aliluokat voivat ylikirjoittaa sen mukauttamista varten.

Template Method JUnitissa

JUnit 4:n setUp() ja tearDown() ovat hook-metodeja testiajon suorittajan määrittelemässä template-metodissa. Suorittaja hallitsee, milloin niitä kutsutaan.

Template Method Springissä

Springin JdbcTemplate käyttää sisäisesti Template Methodia. Template ohjaa yhteyttä, lauseen luontia ja siivousta; te toimitatte RowMapper-lambdan vaihtelevaa ”map row” -vaihetta varten.

List<User> users = jdbcTemplate.query(
    "SELECT * FROM users",
    (rs, row) -> new User(rs.getLong("id"), rs.getString("name"))
);

Välttäkää syvää perintähierarkiaa

Template Method perustuu perintään, joka voi tuottaa syviä luokkahierarkioita. Rajoittakaa hierarkia 1–2 tasoon. Jos aliluokat alkavat ylikirjoittaa monia vaiheita eri tavoin, harkitkaa vaihtamista Strategyyn.

Pikatarkistus

Mikä avainsana estää aliluokkia muuttamasta template-metodin vaiheiden järjestystä?

Kertaus

Template Method lukitsee algoritmin rungon perusluokkaan määreellä final. Aliluokat toteuttavat abstraktit vaiheet ja voivat halutessaan ylikirjoittaa hook-metodeja. Pitäkää hierarkiat matalina ja käyttäkää Strategya, kun tarvitaan enemmän joustavuutta.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Template Method: algoritmien rungot” ilmainen?

Kyllä – oppitunnin ”Template Method: algoritmien rungot” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Template Method: algoritmien rungot”?

Määritä algoritmin runko kantaluokassa ja anna aliluokkien täyttää sen vaiheet. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Template Method: algoritmien rungot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Observer-malli: tapahtumailmoitukset
  2. Strategy-malli: vaihdettavat algoritmit
  3. Command-malli: toimintojen kapselointi
  4. Template Method: algoritmien rungot
← Takaisin: Java Academy