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
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
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:[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
/** * 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
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
- ↑ 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