์์์ ํตํด Super Class์ ๊ธฐ๋ฅ์ ํ์ฅํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. Super Class์์ ์ถ์ ๋ฉ์๋ ๋๋ ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅํ ๋ฉ์๋๋ฅผ ์ ์ํด๋๊ณ ์ด๋ฅผ ํ์ฉํด ์ฝ๋์ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ์ ๋ด๊ณ ์๋ ํ
ํ๋ฆฟ ๋ฉ์๋๋ฅผ ๋ง๋ ๋ค. ์ด๋ ๊ฒ ์๋ธ ํด๋์ค์์ ์ ํ์ ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ํ ์ ์๋๋ก ๋ง๋ค์ด๋ ๋ฉ์๋๋ฅผ hook(ํ
) ๋ฉ์๋๋ผ๊ณ ํ๋ค.
public abstract class Super{
public void templateMethod() {
// ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ ์ฝ๋
hookMethod();
abstractMethod();
}
protected void hookMethod(){ } // ์ ํ์ ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅํ ํ
๋ฉ์๋
public abstract void abstractMethod(); // ๋ฐ๋์ SubClass์์ ๊ตฌํํด์ผํ๋ ์ถ์ ๋ฉ์๋
}
public Sub extends Super{
@Override
protected void hookMethod(){
//...
}
@Override
public void abstractMethod(){
//...
}
}
์ ์ฒด์ ์ผ๋ก๋ ๋์ผํ๋ฉด์ ๋ถ๋ถ์ ์ผ๋ก๋ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฉ์๋์ ์ฝ๋ ์ค๋ณต์ ์ต์ํ ํ ๋ ์ ์ฉํ๋ค. ์ฆ, ๋ณ๊ฒฝ๋ ๊ธฐ๋ฅ์ Super Class์ ๋ง๋ค์ด๋๊ณ ์์ฃผ ๋ณ๊ฒฝ๋๋ฉฐ ํ์ฅํ ๊ธฐ๋ฅ์ SubClass์ ๋ง๋ค๋ ์ฌ์ฉํ๋ฉด ์ข๋ค.
์๋ฅผ ๋ค์ด, ๊ฐ ํ์ฌ๋ณ๋ก ๋์ผํ EP ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ์ Template(Super Class)๋ฅผ ์์ฑํด๋๊ณ , ํด๋น Template์ ์์๋ฐ์ ํ์ฅํ ๊ธฐ๋ฅ์ Sub Class์์ ๊ฐ๊ฐ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ค.
์์
๋ถ์ด๋นต์ ๋ง๋๋ ๊ณผ์ ์ ์๊ฐํด๋ณด์. ์ํ๋ฆผ ๋ถ์ด๋นต, ํฅ ๋ถ์ด๋นต, ์ด์ฝ ๋ถ์ด๋นต ๋ฑ ์ํ๋ ์ฌ๋ฃ๋ฅผ ์์ ๋ฃ์ ์ ์๋ค.
public abstract class BoongABangTemplate{
// final ์ ์ธ์ผ๋ก Override ๊ธ์ง
public final void makeBoongABang(){
buyOven();
makeIngredient();
secretRecipe();
bake();
}
protected void buyOven(){}; // ๊ฐ์ ์ค๋ธ์ ์ด์ง๋ ์ ํํ ์ ์์.
// ๋ถ์ด๋นต์์ ์ฌ๋ฃ๋ ๊ตฝ๋๊ฑฐ๋ ๊ฐ์ ๊ตฌํ ํ์
public abstract void makeIngredient();
public abstract void bake();
// ๊ธฐ๋ณธ์ผ๋ก ๊ตฌํ, ๋ชป๋ฐ๊ฟ!
private void secretRecipe(){
System.out.println("๋น๋ฒ");
};
}
public PuffBoongABbang extends BoongABangTemplate{
@Override
public abstract void makeIngredient(){
System.out.println("๋ฐ์ฃฝ์ ๊พธ๋ํ๊ฒ ๋ง๋ ๋ค.");
System.out.println("์ํฌ๋ฆผ์ ๋ง๋ ๋ค.");
};
@Override
public abstract void bake(){
System.out.println("100๋์ ๋ถ์ด๋นต์ ๋ฐ์ญํ๊ฒ 2๋ถ ๊ตฝ๋๋ค.");
};
}
public RedBeanBoongABbang extends BoongABangTemplate{
@Override
protected void buyOven(){
System.out.println("์ต์ ๋ถ์ด๋นตํ์ ์ฐ๋ค.");
}
@Override
public abstract void makeIngredient(){
System.out.println("๋ฐ์ฃฝ์ ๋ฌฝ๊ฒ ๋ง๋ ๋ค.");
System.out.println("ํฅ์ ๋ง๋ ๋ค.");
};
@Override
public abstract void bake(){
System.out.println("100๋์ ๋ถ์ด๋นต์ ๋ฐ์ญํ๊ฒ 2๋ถ ๊ตฝ๋๋ค.");
};
}
์ฐธ๊ณ