π‘ ν νλ¦Ώ λ©μλ(Template Method) ν¨ν΄μ΄λ?
λΆλͺ¨ ν΄λμ€μμ μκ³ λ¦¬μ¦μ 골격μ μ μνμ§λ§, ν΄λΉ μκ³ λ¦¬μ¦μ ꡬ쑰λ₯Ό λ³κ²½νμ§ μκ³ μμ ν΄λμ€λ€μ΄ μκ³ λ¦¬μ¦μ νΉμ λ¨κ³λ€μ μ€λ²λΌμ΄λ(μ¬μ μ)ν μ μλλ‘ νλ νλ λμμΈ ν¨ν΄μ λλ€. μ¬λ¬ ν΄λμ€μμ 곡ν΅μΌλ‘ μ¬μ©νλ λ©μλλ₯Ό ν νλ¦Ών νμ¬ μμ ν΄λμ€μμ μ μνκ³ , νμ ν΄λμ€λ§λ€ μΈλΆ λμ μ¬νμ λ€λ₯΄κ² ꡬνν©λλ€.
ν νλ¦Ώ λ©μλ ν¨ν΄μ μμμ΄λΌλ κΈ°μ μ κ·Ήλννμ¬,μκ³ λ¦¬μ¦μ λΌλλ₯Ό λ§μΆλ κ²μ μ΄μ μ λ‘λλ€. μ΄λ―Έ μλ§μ νλ μμν¬μμ λ§μ λΆλΆμ ν νλ¦Ώ λ©μλ ν¨ν΄ μ½λκ° μ°λ¦¬λ λͺ¨λ₯΄κ² μ μ©λμ΄ μμ΅λλ€.
π‘ ν΄λμ€ λ€μ΄μ΄κ·Έλ¨μΌλ‘ λ³Έ ν νλ¦Ώ λ©μλ ν¨ν΄
- Abstract Class : μκ³ λ¦¬μ¦μ λ¨κ³λ€μ μν μ νλ λ©μλλ€μ μ μΈνλ©°, μ΄λ¬ν λ©μλλ₯Ό νΉμ μμλ‘ νΈμΆνλ μ€μ ν νλ¦Ώ λ©μλλ μ μΈν©λλ€. λ¨κ³λ€μ abstractλ‘ μ μΈλκ±°λ μΌλΆ λν΄νΈ ꡬνμ κ°μ΅λλ€.
- Concrete Class : λͺ¨λ λ¨κ³λ€μ μ€λ²λΌμ΄λν μ μμ§λ§, ν νλ¦Ώ λ©μλ μ체λ μ€λ²λΌμ΄λν μ μμ΅λλ€.
- Hook Method : λΆλͺ¨μ ν νλ¦Ώ λ©μλμ μν₯μ΄λ μμλ₯Ό μ μ΄νκ³ μΆμ λ μ¬μ©λλ λ©μλλ‘, μ ν΄λμ€ λ€μ΄μ΄κ·Έλ¨μμ step2()κ° ν΄λΉν©λλ€. ν λ©μλλ μΆμ λ©μλκ° μλ μΌλ° λ©μλλ‘ κ΅¬ννλλ°, μ΄λ μ νμ μΌλ‘ μ€λ²λΌμ΄λνκΈ° μν΄μμ λλ€.
π‘ ν νλ¦Ώ λ©μλ ν¨ν΄ ꡬν
abstract class AbstractTemplate {
// ν
νλ¦Ώ λ©μλ : λ©μλ μμ final ν€μλλ₯Ό λΆμ΄λ©΄ μμ ν΄λμ€μμ μ€λ²λΌμ΄λ©μ΄ λΆκ°λ₯ν¨.
// μμ ν΄λμ€μμ μμ ν
νλ¦Ώμ μ€λ²λΌμ΄λ©ν΄μ μκΈ°λ§μλλ‘ λ°κΎΈλλ‘ νλ νμλ₯Ό μμ² λ΄μ
public final void templateMethod() {
// μμνμ¬ κ΅¬νλλ©΄ μ€νλ λ©μλλ€
step1();
step2();
if(hook()) { // μμ λ‘μ§μ μ€ννκ±°λ μ€ννμ§ μμ
// ...
}
step3();
}
boolean hook() {
return true;
}
// μμνμ¬ μ¬μ©ν κ²μ΄κΈ° λλ¬Έμ protected μ κ·Όμ μ΄μ μ€μ
protected abstract void step1();
protected abstract void step2();
protected abstract void step3();
}
class ImplementationA extends AbstractTemplate {
@Override
protected void step1() {}
@Override
protected void step2() {}
@Override
protected void step3() {}
}
class ImplementationB extends AbstractTemplate {
@Override
protected void step1() {}
@Override
protected void step2() {}
@Override
protected void step3() {}
// hook λ©μλλ₯Ό μ€λ²λΌμ΄λ ν΄μ falseλ‘ νμ¬ ν
νλ¦Ώμμ λ§μ§λ§ λ‘μ§μ΄ μ€νλμ§ μλλ‘ μ€μ
@Override
protected boolean hook() {
return false;
}
}
π‘ λ§λ¬΄λ¦¬
ν νλ¦Ώ λ©μλ ν¨ν΄μ
- ν΄λΌμ΄μΈνΈκ° μκ³ λ¦¬μ¦μ νΉμ λ¨κ³λ§ νμ₯νκ³ , μ 체 μκ³ λ¦¬μ¦μ΄λ ν΄λΉ ꡬ쑰λ νμ₯νμ§ μλλ‘ ν λ
- λμΌν κΈ°λ₯μ μμ ν΄λμ€μμ μ μνλ©΄μ νμ₯, λ³νκ° νμν λΆλΆλ§ νμ ν΄λμ€μμ ꡬνν λ
μ μ¬μ©ν μ μμ΅λλ€.
ν νλ¦Ώ λ©μλ ν¨ν΄μ μ¬μ©νλ©΄, ν΄λΌμ΄μΈνΈκ° λκ·λͺ¨ μκ³ λ¦¬μ¦μ νΉμ λΆλΆλ§ μ¬μ μνλλ‘ νμ¬, μκ³ λ¦¬μ¦μ λ€λ₯Έ λΆλΆμ λ°μνλ λ³κ²½ μ¬νμ μν₯μ λ λ°λλ‘ ν©λλ€.(OCP μ€μ) λν, μμ μΆμν΄λμ€λ‘ λ‘μ§μ 곡ν΅ν νμ¬ μ½λμ μ€λ³΅μ μ€μΌ μ μκ³ , ν΅μ¬ λ‘μ§μ μμ ν΄λμ€μμ κ΄λ¦¬νλ―λ‘μ κ΄λ¦¬κ° μ©μ΄ν΄μ§λλ€.