ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด (Template Method Pattern)
์์ ํด๋์ค์์ ์๊ณ ๋ฆฌ์ฆ์ ๊ณจ๊ฒฉ์ ์ ์ํ๊ณ , ์ธ๋ถ ๊ตฌํ์ ํ์ ํด๋์ค์์ ์ฒ๋ฆฌํ๋ ํจํด์
๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ํน์ ๋จ๊ณ๋ฅผ ์๋ธํด๋์ค์์ ์ฌ์ ์ํ ์ ์์ด ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
์ฃผ์ ๋ชฉ์
โข
์๊ณ ๋ฆฌ์ฆ์ ๋ผ๋๋ ์ ์งํ๋ฉด์ ์ธ๋ถ ๊ตฌํ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๊ฒ ํจ
โข
์ค๋ณต ์ฝ๋๋ฅผ ์ค์ด๊ณ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ ํฅ์
โข
์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ถ๋ถ์ ์๋ธํด๋์ค์์ ํ์ฅ ๊ฐ๋ฅ
ํน์ง
โข
์์ ํด๋์ค์์ ์๊ณ ๋ฆฌ์ฆ์ ๊ณจ๊ฒฉ์ ์ ์
โข
ํ์ ํด๋์ค์์ ์๊ณ ๋ฆฌ์ฆ์ ํน์ ๋จ๊ณ๋ฅผ ๊ตฌํ
โข
ํ
(Hook) ๋ฉ์๋๋ฅผ ํตํด ์ ํ์ ํ์ฅ ๊ฐ๋ฅ
โข
์ ์ฒด์ ์ธ ์๊ณ ๋ฆฌ์ฆ ๊ตฌ์กฐ ๋ณ๊ฒฝ ์์ด ์ธ๋ถ ๋์ ์์ ๊ฐ๋ฅ
์์ ์ฝ๋
abstract class Beverage {
// ํ
ํ๋ฆฟ ๋ฉ์๋
final void prepareBeverage() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) {
addCondiments();
}
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("๋ฌผ์ ๋์
๋๋ค");
}
void pourInCup() {
System.out.println("์ปต์ ๋ฐ๋ฆ
๋๋ค");
}
// ํ
(Hook) ๋ฉ์๋
boolean customerWantsCondiments() {
return true;
}
}
class Coffee extends Beverage {
void brew() {
System.out.println("์ปคํผ๋ฅผ ์ฐ๋ฆฝ๋๋ค");
}
void addCondiments() {
System.out.println("์คํ๊ณผ ์ฐ์ ๋ฅผ ์ถ๊ฐํฉ๋๋ค");
}
}
Java
๋ณต์ฌ
์ฝ๋ ์ค๋ช
์ ์์ ์ฝ๋๋ ์๋ฃ ์ ์กฐ ๊ณผ์ ์ ํ
ํ๋ฆฟ ๋ฉ์๋ ํจํด์ผ๋ก ๊ตฌํํ ๊ฒ์
๋๋ค:
โข
Beverage ํด๋์ค (์ถ์ ํด๋์ค)
โฆ
prepareBeverage(): ์๋ฃ ์ ์กฐ์ ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ ํ
ํ๋ฆฟ ๋ฉ์๋
โฆ
brew(), addCondiments(): ์๋ธํด๋์ค์์ ๊ตฌํํด์ผ ํ๋ ์ถ์ ๋ฉ์๋
โฆ
boilWater(), pourInCup(): ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ๊ตฌ์ฒด์ ์ธ ๋ฉ์๋
โฆ
customerWantsCondiments(): ์ ํ์ ๋์์ ์ํ ํ
๋ฉ์๋
โข
Coffee ํด๋์ค (๊ตฌ์ฒด ํด๋์ค)
โฆ
brew(): ์ปคํผ ์ฐ๋ฆฌ๋ ๊ณผ์ ๊ตฌํ
โฆ
addCondiments(): ์ฒจ๊ฐ๋ฌผ ์ถ๊ฐ ๊ณผ์ ๊ตฌํ
์ด์ฒ๋ผ ํ
ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์ฌ์ฉํ๋ฉด ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ Beverage ํด๋์ค์์ ๊ด๋ฆฌํ๊ณ , ์ค์ ๊ตฌํ์ Coffee์ ๊ฐ์ ํ์ ํด๋์ค์์ ๋ด๋นํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ์ ์ฐํ ํ์ฅ์ด ๊ฐ๋ฅํด์ง๋๋ค.