Sablonfüggvény programtervezési minta
Ezt a szócikket át kellene olvasni, ellenőrizni a szöveg helyesírását és nyelvhelyességét, a tulajdonnevek átírását. Esetleges további megjegyzések a vitalapon. |
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.[1] Lehetővé teszi egyes algoritmusok lépéseinek az újradefiniálását anélkül, hogy az algoritmus struktúrája megváltozna.[2]
Az itt használt sablon kifejezés alatt nem a „C++” -os sablonokat kell érteni.
Bevezetés
[szerkeszté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.[1]
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.[3] Í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.[2] 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
[szerkesztés]Használata
[szerkesztés]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:[3]
- Lehetővé teszi az alosztályok megvalósítását (metódus felülírással) változó viselkedésekkel.[4]
- 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.[4]
- 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.[4]
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.[5]
Példa
[szerkesztés]/**
* 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
[szerkesztés]Ez a szócikk részben vagy egészben a Template method pattern című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.
Jegyzetek
[szerkesztés]- ↑ a b Template Method, Design Patterns. Addison-Wesley, 325–330. o. (1994). ISBN 0-201-63361-2
- ↑ a b Head First Design Patterns (paperback), O'REILLY, 289, 311. o. (2004). ISBN 978-0-596-00712-6. Hozzáférés ideje: 2012. szeptember 12.
- ↑ a b Template Method Design Pattern. Source Making - teaching IT professional. (Hozzáférés: 2012. szeptember 12.) „Template Method is used prominently in frameworks.”
- ↑ a b c Chung, Carlo. Pro Objective-C Design Patterns for iOS. Berkely, CA: Apress, 266. o. (2011). ISBN 978-1-4302-3331-2
- ↑ Pattern Hatching: Design Patterns Applied. Addison-Wesley Professional, 85–101. o. (1998. június 22.). ISBN 978-0201432930