Često programeri zamisle kako se nešto odvija, po koracima u nekom redosledu itd. Progrmer ne zna kako će konkretno izgledati svi ti koraci te će se neki proglasiti apstraktnim a metoda u kojoj se ti koraci pozivaju u tačnom rasporedu se zove Template method ili šablonska metoda. U konkretnoj situaciji će se naslediti ta klasa i svaki će se korak implementirati a šablonska metoda će ostati ista. Evo primera:
Code:
public abstract class OpšteKuvanjeKafe {
public final void skuvajKafu() {
provriVodu();
kuvaj();
napuniŠoljice();
}
abstract void kuvaj();
void provriVodu() {
System.out.printl("Voda vri");
}
void napuniŠoljice() {
System.out.printl("Sipam u šoljice");
}
}
Metoda skuvajKafu je šablonska. Za svaku kafu se zna kako se voda provre i kako se šoljice pune, ali kako se kuva to zavisi od vrste kafe (turska itd.). Zato je metoda kuvaj apstraktna, njena implementacija će se dati u potklasi.
Sad dolazimo do hook metoda. Metoda koja se poziva u šablonskoj metodi i ima neku trivijalnu implementaciju implementaciju koja ne radi ništa je hook metoda. Programer kad nasleđuje klasu može dati neku novu implementaciju toj metodi a ne mora. Kod apstraktnih metoda mora da da implementciju ili da tu klasu proglasi apstraktnom.
Evo nadogradnja prošlog primera sa hook metodom. Postoje kafe kod kojih se obavezno dodaje neki dodatak a ima onih kod kojih se dodaje po želji:
Code:
public abstract class OpšteKuvanjeKafe {
public final void skuvajKafu() {
provriVodu();
kuvaj();
napuniŠoljice();
if (mušterijaTražiDodatak()) {
dodajDodatak();
}
}
abstract void kuvaj();
void provriVodu() {
System.out.printl("Voda vri");
}
void napuniŠoljice() {
System.out.printl("Sipam u šoljice");
}
boolean mušterijaTražiDodatak() {
return true;
}
}
Metoda mušterijaTražiDodatak() je hook metoda. Ona samo vraća true i ako se ne redefiniše metoda dodajDodatak će se uvek izvršavati. A može se redefinisati da npr. pita mušteriju da li želi dodatak (kocka šećera, šlag...) može se redefinisati da vraća uvek false itd.
Vrlo često hook metode nemaju nikakvu implementaciju samo { }. Takve su npr. metode klase Applet: init, start, stop, destroy...
Bolje džaba ležat nego džaba radit.