컀νΌμ νμ°¨λ₯Ό λ§λλ κ³Όμ μ μμ
컀νΌμ νμ°¨λ₯Ό λ§λ€ λ κ³Όμ μ΄ λ§€μ° λΉμ·ν¨
μ΄λ, λ¬Όμ λμΈλ€κ±°λ μ΄λ€ 물체λ₯Ό μ°λ €λΈλ€λ κ²μ΄ λ§€μ° μ μ¬ν¨
λ°λΌμ, μ΄λ₯Ό 곡ν΅μΌλ‘ λ½μ λ΄μ΄ λΆλͺ¨ μ»΄ν¬λνΈλ‘ λ§λ€ μ μμ
abstract class CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
// ꡬ체 ꡬν
}
void pourInCup() {
// ꡬ체 ꡬν
}
}
class Tea extends CaffeineBeverage {
void brew() {
// ꡬ체 ꡬν
}
void addCondiments() {
// ꡬ체 ꡬν
}
}
...
prepareRecipe νΈμΆ μ κ° κ΅¬ν체 ( Tea / Coffee )μ λ§λλ‘ λμprepareReceipe λ₯Ό finalλ‘ μ μΈ ν΄ λμμΌλ‘μ¨ μλΈν΄λμ€μμ override νμ¬ μλͺ» μ¬μ©λλμΌμ λ°©μ§prepareRecipe λ₯Ό ν
νλ¦Ώ λ©μλλΌκ³ λͺ
λͺ
ν νλ¦Ώ λ©μλλ, μκ³ λ¦¬μ¦μ κ° λ¨κ³λ₯Ό μ μνλ©° κ·Έμ€ νκ° μ΄μμ λ¨κ³κ° μλΈν΄λμ€μ μν΄ κ΅¬ν λ μ μμ
ν νλ¦Ώ λ©μλλ₯Ό μ μ©νμλμ μ₯μ
Template method μμ Hook ν¨μλ₯Ό λμ΄ Template methodμ μκ³ λ¦¬μ¦μ μλΈν΄λμ€μμ μμ νλλ‘ ν μ μμ
abstract class CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (hookBoolean()) {
addCondiments();
}
hook();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
// ꡬ체 ꡬν
}
void pourInCup() {
// ꡬ체 ꡬν
}
void hook() {}
boolean hookBoolean() {
return true;
}
}
<aside> π‘ ν νλ¦Ώ λ©μλμμ μκ³ λ¦¬μ¦μ 골격μ μ μνκ³ , ν νλ¦Ώ λ©μλ λ΄μ μκ³ λ¦¬μ¦ λ¨κ³ μ€ μΌλΆλ μλΈν΄λμ€μμ ꡬννλλ‘ μμνλ κ²
</aside>
<aside> π‘ μ μμ€ μ»΄ν¬λνΈ μμλ κ³ μμ€ μ»΄ν¬λνΈλ₯Ό νΈμΆ ν μ μκ² νκ³ , κ³ μμ€ μ»΄ν¬λνΈμμλ μ μμ€ μ»΄ν¬λνΈκ° νμ ν λ νΈμΆνλλ‘ νλ κ²
</aside>
boilWater / pourInCup μ ꡬννμ§λ§, μ΄λ₯Ό μ¬μ©νλκ³³μ κ³ μμ€ μ»΄ν¬λνΈ