Template Method Pattern

https://www.cs.unc.edu/~stotts/GOF/hires/Pictures/tmethod.gif

์ƒ์†์„ ํ†ตํ•ด 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๋ถ„ ๊ตฝ๋Š”๋‹ค.");
  };
}

์ฐธ๊ณ 

Last updated

Was this helpful?