Sablonfüggvény programtervezési minta
A számítógép-programozásban a sablonfüggvény programtervezési minta vagy röviden sablonfüggvény minta egy olyan viselkedési, tervezési minta, amely egy sablonfüggvény nevű metódus algoritmusával definiálja a program vázát. Ezek némely lépése felüldefiniálható alosztályokban. Lehetővé teszi egyes algoritmusok lépéseinek az újradefiniálását anélkül, hogy az algoritmus struktúrája megváltozna.

Az itt használt sablon kifejezés alatt nem a „C++” -os sablonokat kell érteni.

Bevezetés 

Ebben a tervezési mintában a sablonmetódusnak egy vagy több algoritmikus lépése felüldefiniálható az alosztályokban, megengedve eltérő viselkedéseket, miközben a teljes algoritmus lényegében változatlan.

Az objektumorientált programozásban az elsőnek létrehozott osztály biztosítja a tervezési algoritmus alaplépéseit. Ezek a lépéseket az absztrakt metódusok valósítják meg. Később, az alosztályokban az absztrakt metódusokat megváltoztatva jönnek létre a valódi változások. Így az általános algoritmus egy helyen van definiálva, de a konkrét lépések változtathatóak az alosztályokon keresztül.

A sablonfüggvény minta így kezeli a nagyobb szemantika képeit. Ezt a nagyobb képet absztrakt vagy nem absztrakt metódusnak hívják. A nem absztrakt metódusokat teljesen a tervezési minta irányítja, de az absztrakt metódusok az alosztályokban vannak megvalósítva, ezáltal biztosítva a minták erejét és a szabadság mértékét. A tervezési minták absztrakt osztályai szintén meghatározzák a „hook” metódusokat is, melyeket az alosztályokban lehet felül definiálni. Néhány, vagy akár az összes absztrakt metódus specializált lehet egy alosztályban, engedélyezve az írójának bizonyos viselkedéseket minimális módosításokkal a nagyobb szemantikáért. A sablonfüggvény változatlan marad ebben a mintában, biztosítva az alárendelt nem absztrakt és absztrakt metódusok meghívását az eredetileg tervezett szekvenciában.

A sablonfüggvény tervezési minta gyakran előfordul, legalábbis a legegyszerűbb esetben, ahol a metódus csak egyetlenegy absztrakt metódust hív meg egy objektumorientált nyelvben. Ha egy szoftverprogramozó többalakú metódust használ végig, lehet, hogy ez a tervezési minta lesz a természetes velejárója. Ez azért van, mert egy absztrakt vagy többalakú függvény hívása maga az indoka az absztrakt vagy többalakú metódusnak. A sablonfüggvény mintát arra is lehet használni, hogy azonnal plusz értéket adjunk egy szoftvernek.

A sablonfüggvény minta implementációk valósítják meg a védett változók GRASP elvet, mint ahogy az illesztő minta teszi. A különbség annyi, hogy az illesztő minta ugyanazt az interfészt adja néhány operációval, míg a sablonfüggvény minta csak egyet ad egynek.

Struktúra

Használata 
A sablonfüggvény minta leginkább keretrendszerekben használatos. Álljon itt egy példa a kontroll megfordításával kapcsolatosan.

Érvek a sablonfüggvény minta használata mellett:
 Lehetővé teszi az alosztályok megvalósítását (metódus felülírással) változó viselkedésekkel.
 Megóv a kódismétlésektől: Az általános folyamat struktúrát csak egyszer valósítjuk meg az absztrakt osztály(ok) algoritmusában.
 Azoknál az alosztályoknál irányít, ahol megengedett. Szemben egy egyszerű többalakú felülírással, ahol az alap metódus teljesen újraírt lenne, amely radikális változásokat hozna a folyamatba, itt csak egy speciális részlete változik a folyamatban.

Az irányító struktúra az eredménye az alkalmazásnak a tervezési mintából gyakran említve van „Hollywood” alapelvként. Ezt az alapelvet használva, a sablonfüggvény minta egy szülő osztályban irányítja az egész folyamatot, az alosztályok metódusainak meghívásával, ahol szükséges. Ezt láthatjuk a lentebbi Java kódban:

A sablonfüggvény tervminta hasznos, ha automatikusan generált kóddal kell együttműködni. A nehézség abban áll, hogy ha változik a forrás,akkor változik a generált kód is. Ezt még kézi módosítások is változik. Ezt a sablon tervminta használatával ez megoldható, mivel így elkülöníthetők a generált és a kézileg módosított kódrészek. A sablon osztály lehet absztrakt osztály, vagy lehet interfész.

Példa 
/**
 * An abstract class that is common to several games in
 * which players play against the others, but only one is
 * playing at a given time.
 */
 
abstract class Game {
 
    protected int playersCount;
    abstract void initializeGame();
    abstract void makePlay(int player);
    abstract boolean endOfGame();
    abstract void printWinner();
 
    /* A template method : */
    public final void playOneGame(int playersCount) {
        this.playersCount = playersCount;
        initializeGame();
        int j = 0;
        while (!endOfGame()) {
            makePlay(j);
            j = (j + 1) % playersCount;
        }
        printWinner();
    }
}

//Now we can extend this class in order
//to implement actual games:

class Monopoly extends Game {
 
    /* Implementation of necessary concrete methods */
    void initializeGame() {
        // Initialize players
        // Initialize money
    }
    void makePlay(int player) {
        // Process one turn of player
    }
    boolean endOfGame() {
        // Return true if game is over
        // according to Monopoly rules
    }
    void printWinner() {
        // Display who won
    }
    /* Specific declarations for the Monopoly game. */
 
    // ...
}

class Chess extends Game {
 
    /* Implementation of necessary concrete methods */
    void initializeGame() {
        // Initialize players
        // Put the pieces on the board
    }
    void makePlay(int player) {
        // Process a turn for the player
    }
    boolean endOfGame() {
        // Return true if in Checkmate or
        // Stalemate has been reached
    }
    void printWinner() {
        // Display the winning player
    }
    /* Specific declarations for the chess game. */

    // ...
}

Fordítás

Jegyzetek 

Programtervezési minták
Java-kódpéldák
A számítógép-programozásban a sablonfüggvény programtervezési minta vagy röviden sablonfüggvény minta egy olyan viselkedési , tervezési minta , amely egy sablonfüggvény nevű metódus algoritmusával definiálja a program vázát . Ezek némely lépése felüldefiniálható alosztályokban . Lehetővé teszi egyes algoritmusok lépéseinek az újradefiniálását anélkül , hogy az algoritmus struktúrája megváltozna . Az itt használt sablon kifejezés alatt nem a „ C++” -os sablonokat kell érteni . Bevezetés Ebben a tervezési mintában a sablonmetódusnak egy vagy több algoritmikus lépése felüldefiniálható az alosztályokban , megengedve eltérő viselkedéseket , miközben a teljes algoritmus lényegében változatlan . Az objektumorientált programozásban az elsőnek létrehozott osztály biztosítja a tervezési algoritmus alaplépéseit . Ezek a lépéseket az absztrakt metódusok valósítják meg . Később , az alosztályokban az absztrakt metódusokat megváltoztatva jönnek létre a valódi változások . Így az általános algoritmus egy helyen van definiálva , de a konkrét lépések változtathatóak az alosztályokon keresztül . A sablonfüggvény minta így kezeli a nagyobb szemantika képeit . Ezt a nagyobb képet absztrakt vagy nem absztrakt metódusnak hívják . A nem absztrakt metódusokat teljesen a tervezési minta irányítja , de az absztrakt metódusok az alosztályokban vannak megvalósítva , ezáltal biztosítva a minták erejét és a szabadság mértékét . A tervezési minták absztrakt osztályai szintén meghatározzák a „ hook” metódusokat is , melyeket az alosztályokban lehet felül definiálni . Néhány , vagy akár az összes absztrakt metódus specializált lehet egy alosztályban , engedélyezve az írójának bizonyos viselkedéseket minimális módosításokkal a nagyobb szemantikáért . A sablonfüggvény változatlan marad ebben a mintában , biztosítva az alárendelt nem absztrakt és absztrakt metódusok meghívását az eredetileg tervezett szekvenciában . A sablonfüggvény tervezési minta gyakran előfordul , legalábbis a legegyszerűbb esetben , ahol a metódus csak egyetlenegy absztrakt metódust hív meg egy objektumorientált nyelvben . Ha egy szoftverprogramozó többalakú metódust használ végig , lehet , hogy ez a tervezési minta lesz a természetes velejárója . Ez azért van , mert egy absztrakt vagy többalakú függvény hívása maga az indoka az absztrakt vagy többalakú metódusnak . A sablonfüggvény mintát arra is lehet használni , hogy azonnal plusz értéket adjunk egy szoftvernek . A sablonfüggvény minta implementációk valósítják meg a védett változók GRASP elvet , mint ahogy az illesztő minta teszi . A különbség annyi , hogy az illesztő minta ugyanazt az interfészt adja néhány operációval , míg a sablonfüggvény minta csak egyet ad egynek . Struktúra Használata A sablonfüggvény minta leginkább keretrendszerekben használatos . Álljon itt egy példa a kontroll megfordításával kapcsolatosan . Érvek a sablonfüggvény minta használata mellett : Lehetővé teszi az alosztályok megvalósítását ( metódus felülírással ) változó viselkedésekkel . Megóv a kódismétlésektől : Az általános folyamat struktúrát csak egyszer valósítjuk meg az absztrakt osztály( ok ) algoritmusában . Azoknál az alosztályoknál irányít , ahol megengedett . Szemben egy egyszerű többalakú felülírással , ahol az alap metódus teljesen újraírt lenne , amely radikális változásokat hozna a folyamatba , itt csak egy speciális részlete változik a folyamatban . Az irányító struktúra az eredménye az alkalmazásnak a tervezési mintából gyakran említve van „ Hollywood” alapelvként . Ezt az alapelvet használva , a sablonfüggvény minta egy szülő osztályban irányítja az egész folyamatot , az alosztályok metódusainak meghívásával , ahol szükséges . Ezt láthatjuk a lentebbi Java kódban : A sablonfüggvény tervminta hasznos , ha automatikusan generált kóddal kell együttműködni . A nehézség abban áll , hogy ha változik a forrás, akkor változik a generált kód is . Ezt még kézi módosítások is változik . Ezt a sablon tervminta használatával ez megoldható , mivel így elkülöníthetők a generált és a kézileg módosított kódrészek . A sablon osztály lehet absztrakt osztály , vagy lehet interfész . Példa / * * * An abstract class that is common to several games in * which players play against the others , but only one is * playing at a given time . * / abstract class Game { protected int playersCount ; abstract void initializeGame ( ) ; abstract void makePlay( int player ) ; abstract boolean endOfGame ( ) ; abstract void printWinner ( ) ; / * A template method \ : * / public final void playOneGame( int playersCount ) { this.playersCount = playersCount ; initializeGame ( ) ; int j = while ( ! endOfGame ( ) ) { makePlay ( j ) ; j = ( j + % playersCount ; } printWinner ( ) ; } } //Now we can extend this class in order //to implement actual games : class Monopoly extends Game { / * Implementation of necessary concrete methods * / void initializeGame ( ) { / / Initialize players / / Initialize money } void makePlay( int player ) { / / Process one turn of player } boolean endOfGame ( ) { / / Return true if game is over / / according to Monopoly rules } void printWinner ( ) { / / Display who won } / * Specific declarations for the Monopoly game . * / / /\... } class Chess extends Game { / * Implementation of necessary concrete methods * / void initializeGame ( ) { / / Initialize players / / Put the pieces on the board } void makePlay( int player ) { / / Process a turn for the player } boolean endOfGame ( ) { / / Return true if in Checkmate or / / Stalemate has been reached } void printWinner ( ) { / / Display the winning player } / * Specific declarations for the chess game . * / / /\... } Fordítás Jegyzetek Programtervezési minták Java-kódpéldák