Skip to content

Latest commit

ย 

History

History
269 lines (183 loc) ยท 9.79 KB

Template Method Pattern.md

File metadata and controls

269 lines (183 loc) ยท 9.79 KB

๐Ÿ๐Ÿ“‹ Template Method Pattern

Assembled by GimunLee (2019-12-05)


Goal

  • Template Method Pattern์˜ ๊ฐœ๋…์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • Template Method Pattern์˜ ์‚ฌ์šฉ ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Template Method Pattern์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ—๋ฆฌ์šฐ๋“œ ์›์น™๊ณผ Template Method Pattern์˜ ๊ด€๊ณ„์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

What is Template Method Pattern?

Template Method Pattern ์—์„œ๋Š” ๋ฉ”์†Œ๋“œ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ณจ๊ฒฉ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„ ์ค‘ ์ผ๋ถ€๋Š” ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌ์กฐ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ํŠน์ • ๋‹จ๊ณ„๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ์ฃผ์–ด์ง„ ์ƒํ™ฉ์„ ํ†ตํ•ด Template Method Pattern์˜ ์‚ฌ์šฉ ์ด์ ๊ณผ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


์Šคํƒ€๋ฒ„์ฆˆ ์ปคํ”ผ ๋ฐ”๋ฆฌ์Šคํƒ€ ํ›ˆ๋ จ์šฉ ๋ฉ”๋‰ด์–ผ

์Šคํƒ€๋ฒ„์ฆˆ ์ปคํ”ผ ๋งŒ๋“œ๋Š” ๋ฒ•

  1. ๋ฌผ์„ ๋“์ธ๋‹ค.
  2. ๋“๋Š” ๋ฌผ์— ์ปคํ”ผ๋ฅผ ์šฐ๋ ค๋‚ธ๋‹ค.
  3. ์ปคํ”ผ๋ฅผ ์ปต์— ๋”ฐ๋ฅธ๋‹ค.
  4. ์„คํƒ•๊ณผ ์šฐ์œ ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์Šคํƒ€๋ฒ„์ฆˆ ํ™์ฐจ ๋งŒ๋“œ๋Š” ๋ฒ•

  1. ๋ฌผ์„ ๋“์ธ๋‹ค.
  2. ๋“๋Š” ๋ฌผ์— ์ฐจ๋ฅผ ์šฐ๋ ค๋‚ธ๋‹ค.
  3. ์ฐจ๋ฅผ ์ปต์— ๋”ฐ๋ฅธ๋‹ค.
  4. ๋ ˆ๋ชฌ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฉ”๋‰ด์–ผ์„ ์ฝ”๋”ฉ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์‹ค๊ฑด๊ฐ€์š”?


์ผ๋ฐ˜์ ์ธ ์ปคํ”ผ ๋ฐ ํ™์ฐจ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ (JAVA)

Coffee Class

public class Coffee {
   	void prepareRecipe(){
        boilWater(); // ๋ฌผ์„ ๋“์ธ๋‹ค.
        brewCoffeeGrinds(); // ๋“๋Š” ๋ฌผ์— ์ปคํ”ผ๋ฅผ ์šฐ๋ ค๋‚ธ๋‹ค.
        pourInCup(); // ์ปคํ”ผ๋ฅผ ์ปต์— ๋”ฐ๋ฅธ๋‹ค.
        addSugarAndMilk(); // ์„คํƒ•๊ณผ ์šฐ์œ ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
    }
    
    public void boilWater(){
        System.out.println("๋ฌผ ๋“์ด๋Š” ์ค‘");
    }
    
    public void brewCoffeeGrinds(){
        System.out.println("ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์ปคํ”ผ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ์ค‘");
    }
    
    public void pourInCup(){
        System.out.println("์ปต์— ๋”ฐ๋ฅด๋Š” ์ค‘");
    }
    
    public void addSugarAndMilk(){
        System.out.println("์„คํƒ•๊ณผ ์šฐ์œ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘");
    }
}

Tea Class

public class Tea {
   	void prepareRecipe(){
        boilWater(); // ๋ฌผ์„ ๋“์ธ๋‹ค.
        steepTeaBag(); // ๋“๋Š” ๋ฌผ์— ์ฐจ๋ฅผ ์šฐ๋ ค๋‚ธ๋‹ค.
        pourInCup(); // ์ฐจ๋ฅผ ์ปต์— ๋”ฐ๋ฅธ๋‹ค.
        addLemon(); // ๋ ˆ๋ชฌ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    }
    
    public void boilWater(){
        System.out.println("๋ฌผ ๋“์ด๋Š” ์ค‘");
    }
    
    public void steepTeaBag(){
        System.out.println("์ฐจ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ์ค‘");
    }
    
    public void pourInCup(){
        System.out.println("์ปต์— ๋”ฐ๋ฅด๋Š” ์ค‘");
    }
    
    public void addLemon(){
        System.out.println("๋ ˆ๋ชฌ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘");
    }
}

์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜์–ด ์žˆ์œผ๋ฉด ๋””์ž์ธ์„ ๊ณ ์ณ์•ผ ํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Coffeeํ•˜๊ณ  Tea ํด๋ž˜์Šค๊ฐ€ ๊ฑฐ์˜ ๋˜‘๊ฐ™์œผ๋‹ˆ๊นŒ ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„์„ ์ถ”์ƒํ™”์‹œ์ผœ์„œ ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š์„๊นŒ์š”?


์ผ๋ฐ˜์ ์ธ ์ปคํ”ผ ๋ฐ ํ™์ฐจ ์ถ”์ƒํ™”

์—ฌ๋Ÿฌ๋ถ„๋„ ์œ„์™€ ๊ฐ™์ด ์ƒ๊ฐํ•˜์…จ๋‚˜์š”? ์ด ๋ฐ–์— Coffee์™€ Tea ์‚ฌ์ด์— ๊ณตํ†ต์ ์ด ๋” ์—†๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.


Template Method Pattern ์‚ฌ์šฉํ•˜๊ธฐ

์ปคํ”ผ์™€ ํ™์ฐจ ์‚ฌ์ด์— ๋˜๋‹ค๋ฅธ ๊ณตํ†ต์ ์€ ๋งŒ๋“œ๋Š” ๋ฒ•์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด ๋˜‘๊ฐ™๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ์Šคํƒ€๋ฒ„์ฆˆ์˜ ๋ฉ”๋‰ด์–ผ์„ ์‚ดํŽด๋ณด๋ฉด,

  1. ๋ฌผ์„ ๋“์ธ๋‹ค.
  2. ๋œจ๊ฑฐ์šด ๋ฌผ์„ ์ด์šฉํ•˜์—ฌ ์ปคํ”ผ ๋˜๋Š” ํ™์ฐจ ๋ฅผ ์šฐ๋ ค๋‚ธ๋‹ค.
  3. ๋งŒ๋“ค์–ด์ง„ ์Œ๋ฃŒ๋ฅผ ์ปต์— ๋”ฐ๋ฅธ๋‹ค.
  4. ๊ฐ ์Œ๋ฃŒ์— ๋งž๋Š” ์ฒจ๊ฐ€๋ฌผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ, ์ด๋ฏธ ์ถ”์ƒํ™”ํ•œ 1๋ฒˆ, 3๋ฒˆ ์ด์™ธ์—๋„ ๋‚˜๋จธ์ง€ 2๋ฒˆ, 4๋ฒˆ ๋˜ํ•œ ์ถ”์ƒํ™”๊ฐ€ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋จผ์ €, ์ปคํ”ผ์™€ ํ™์ฐจ์—์„œ ์‚ฌ์šฉํ•ด๋„ ์ด์ƒํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜ํผํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

CaffeineBeverage Class

public abstract class CaffeineBeverage {
	
    final void prepareRecipe() { // ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์„œ ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ 
                                 // ์Œ๋ฃŒ๋ฅผ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋„๋ก final๋กœ ์„ ์–ธํ•ด์ค๋‹ˆ๋‹ค.
        boilWater();
        brew(); 
        pourInCup();
        addCondiments();
    }
    
    void boilWater() {
        System.out.println("๋ฌผ์„ ๋“์ด๋Š” ์ค‘");
    }
    
    abstract void brew();           // Coffee์™€ Tea์—์„œ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ 
    abstract void addCondiments();  // ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋กœ ์„ ์–ธํ•ด์ค๋‹ˆ๋‹ค.
    
    void pourInCup() {
        System.out.println("์ปต์— ๋”ฐ๋ฅด๋Š” ์ค‘");
    }
    
}

Tea Class

public class Tea extends CaffeineBeverage {
	public void brew() {
		System.out.println("์ฐจ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ์ค‘");
	}
	
	public void addCondiments() {
		System.out.println("๋ ˆ๋ชฌ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘");
	}
}

Coffee Class

public class Coffee extends CaffeineBeverage {
	public void brew() {
		System.out.println("ํ•„ํ„ฐ๋กœ ์ปคํ”ผ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ์ค‘");
	}
	
	public void addCondiments() {
		System.out.println("์„คํƒ•๊ณผ ์ปคํ”ผ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘");
	}
}

์ด์ฒ˜๋Ÿผ Template Method Pattern ์—์„œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ ๋‹จ๊ณ„๋“ค์„ ์ •์˜ํ•˜๋ฉฐ, ๊ทธ ์ค‘ ํ•œ ๊ฐœ ์ด์ƒ์˜ ๋‹จ๊ณ„๊ฐ€ ์„œ๋ธŒํด๋ž˜์Šค์— ์˜ํ•ด ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Template Method Pattern์˜ ์‚ฌ์šฉ ์ด์ 

  • CoffeineBeverage ํด๋ž˜์Šค์—์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ˜ผ์ž ๋…์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • CoffeineBeverage ๋•๋ถ„์— ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•œ ๊ตฐ๋ฐ์— ๋ชจ์—ฌ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ถ€๋ถ„๋งŒ ๊ณ ์น˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • Template Method Pattern์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „์—์„œ๋Š” ๋‹ค๋ฅธ ์นดํŽ˜์ธ ์Œ๋ฃŒ๋„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์นดํŽ˜์ธ ์Œ๋ฃŒ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • CaffeineBeverage ํด๋ž˜์Šค์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ์ง€์‹์ด ์ง‘์ค‘๋˜์–ด ์žˆ์œผ๋ฉด ์ผ๋ถ€ ๊ตฌํ˜„๋งŒ ์„œ๋ธŒํด๋ž˜์Šค์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

Template Method Pattern๊ณผ Hook

ํ›„ํฌ(hook)๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์—์„œ ์„ ์–ธ๋˜๋Š” ๋ฉ”์†Œ๋“œ๊ธด ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ๋งŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ์•„๋ฌด ์ฝ”๋“œ๋„ ๋“ค์–ด์žˆ์ง€ ์•Š์€ ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋ธŒํด๋ž˜์Šค ์ž…์žฅ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์œ„์น˜์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๋Š” ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์šฐ์„  ํ•œ๊ฐ€์ง€ ์‚ฌ์šฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

CaffeineBeverage Class

public abstract class CaffeineBeverageWithHook {
    void prepareRecipe() {
        boilWater();
        brew(); 
        pourInCup();
        
        if(customerWantsCondiments()){
        	addCondiments();    
        }
    }
    
    void boilWater() {
        System.out.println("๋ฌผ์„ ๋“์ด๋Š” ์ค‘");
    }
    
    abstract void brew();          
    abstract void addCondiments(); 
    
    void pourInCup() {
        System.out.println("์ปต์— ๋”ฐ๋ฅด๋Š” ์ค‘");
    }
    
    boolean customerWantsCondiments() { // ์ด ๋ฉ”์†Œ๋“œ๋Š” ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ํ•„์š”์— ๋”ฐ๋ผ 
        return true;                    // ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์ด๋ฏ€๋กœ ํ›„ํฌ์ž…๋‹ˆ๋‹ค.
    }
}

์ด ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, Coffee๋‚˜ Tea์™€ ๊ฐ™์€ ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ํ•„์š”์— ๋”ฐ๋ผ customerWantsConidments() ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์„œ ์Œ๋ฃŒ์— ์ฒจ๊ฐ€๋ฌผ์„ ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ—๋ฆฌ์šฐ๋“œ ์›์น™

ํ—๋ฆฌ์šฐ๋“œ ์›์น™์€ ๋””์ž์ธ ์›์น™์œผ๋กœ ๋จผ์ € ์—ฐ๋ฝํ•˜์ง€ ๋งˆ์„ธ์š”. ์ €ํฌ๊ฐ€ ์—ฐ๋ฝ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž…๋‹ˆ๋‹ค.

ํ—๋ฆฌ์šฐ๋“œ ์›์น™์„ ํ™œ์šฉํ•˜๋ฉด ์˜์กด์„ฑ ๋ถ€ํŒจ(dependency rot) ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜์กด์„ฑ ๋ถ€ํŒจ๋Š” ๊ตฌ์„ฑ์š”์†Œ ๊ฐ„์˜ ์˜์กด์„ฑ์ด ๋ณต์žกํ•˜๊ฒŒ ๊ผฌ์—ฌ์žˆ๋Š” ๊ฒƒ์„ ์˜ํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์˜์กด์„ฑ์ด ๋ถ€ํŒจํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ์–ด๋–ค ์‹์œผ๋กœ ๋””์ž์ธ๋œ ๊ฒƒ์ธ์ง€ ๊ฑฐ์˜ ์•„๋ฌด๋„ ์•Œ์•„๋ณผ ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ—๋ฆฌ์šฐ๋“œ ์›์น™์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ €์ˆ˜์ค€ ๊ตฌ์„ฑ์š”์†Œ์—์„œ ์‹œ์Šคํ…œ์— ์ ‘์†์„ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์–ธ์ œ ์–ด๋–ค ์‹์œผ๋กœ ๊ทธ ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ ์‚ฌ์šฉํ• ์ง€๋Š” ๊ณ ์ˆ˜์ค€ ๊ตฌ์„ฑ์š”์†Œ์—์„œ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ณ ์ˆ˜์ค€ ๊ตฌ์„ฑ์š”์†Œ์—์„œ ์ €์ˆ˜์ค€ ๊ตฌ์„ฑ์š”์†Œ์—๊ฒŒ "๋จผ์ € ์—ฐ๋ฝํ•˜์ง€๋งˆ์„ธ์š”. ์ œ๊ฐ€ ๋จผ์ € ์—ฐ๋ฝ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค." ๋ผ๊ณ  ์–˜๊ธฐ๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


ํ—๋ฆฌ์šฐ๋“œ ์›์น™๊ณผ Template Method Pattern

์œ„์˜ ์˜ˆ์ œ์—์„œ ์„ค๋ช…ํ•˜์ž๋ฉด, CaffeineBeverage๋Š” ๊ณ ์ˆ˜์ค€ ๊ตฌ์„ฑ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์Œ๋ฃŒ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ํ•ด๋‹นํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์žฅ์•…ํ•˜๊ณ  ์žˆ๊ณ , ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๋ถˆ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค.

์„œ๋ธŒํด๋ž˜์Šค๋Š” ์ž์งˆ๊ตฌ๋ ˆํ•œ ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

CaffaeineBeverage ํด๋ž˜์Šค์˜ ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” Tea๋‚˜ Coffee ๊ฐ™์€ ๊ตฌ์ƒ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ CaffeineBeverage์— ์ถ”์ƒํ™”๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์— ์˜์กดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์˜์กด์„ฑ์ด ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฐ–์—๋„ ํ—๋ฆฌ์šฐ๋“œ ์›์น™์„ ์‚ฌ์šฉํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์—๋Š” Factory Method Pattern , Observer Pattern ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


Conclusion

Template Method Pattern์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์•„์ฃผ ํ›Œ๋ฅญํ•œ ๋””์ž์ธ ๋„๊ตฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์€ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ๋„, ํ”„๋ ˆ์ž„์šฐํฌ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ ๋‹จ๊ณ„๋Š” ๊ทธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ ๋งˆ์Œ๋Œ€๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Template Method Pattern์™€ Strategy Pattern์€ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•ด๋ณด์ด๋Š”๋ฐ, ๋ถ„๋ช…ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


Reference & Additional Resources

  • HeadFirstDesignPattern