White Whale Studio

Template Method Pattern (템플릿 메서드 패턴) 본문

IT Engineering/객체지향&디자인 패턴

Template Method Pattern (템플릿 메서드 패턴)

glorymind 2016. 6. 14. 18:10
반응형

템플릿 메서드 패턴은

1. 실행 과정을 구현한 상위 클래스

2. 실행 과정의 일부 단계를 구현한 하위 클래스

로 구성됩니다.


1.번의 상위 클래스는 기능 구현 시 필요한 각 단계를 정의하며, 일부는 추상 메서드로 구성됩니다.

이 추상 메서드는 하위클래스에서 구현됩니다.


간단하게 그림으로 살펴보면,


요런 모양이 되겠네요. 


정리 해보면,

상위 클래스는 공통기능을 구현한 템플릿 메서드와 하위 클래스에서 개별적으로 기능 구현을 할 수 있도록 규약을 지정하는 추상 메서드로 구성이 됩니다.

하위 클래스는 이 상위 클래스를 상속받아서 공통기능인 템플릿 메서드는 상위 클래스의 흐름을 따르고 하위 클래스에서 개별적으로 작성해야하는 추상 메서드의 실제 구현을 수행하게 되겠네요.

우선 예제로 음료를 만드는 과정으로 해당 패턴을 살펴볼까요~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    public abstract class Beverage
    {
        // 공통기능은 실 구현
        public void boilWater()
        {
            Console.WriteLine("물 끓이기");
        } // 물끓이기
 
        public void pourInCup()
        {
            Console.WriteLine("컵에 따르기");
        } // 컵에 물 따르기
 
        // 하위에서 따로 구현해야할 기능은 추상 메서드로 선언하며 추가로 제한자는
// protected를 사용하여 자식클래스 계열에서만 사용
        protected abstract void addCondiments(); // 재료 넣기
        protected abstract void makeBeverage(); // 음료 만들기 
 
        public void PrepareRecipe(string B_Name)
        {
            Console.WriteLine("{0} 만들기~!", B_Name);
            this.boilWater();
            this.addCondiments(); // 하위 클래스에서 구현
            this.makeBeverage(); // 하위 클래스에서 구현
            this.pourInCup();
        }
    }
cs

위의 코드는 1번의 상위 클래스입니다. 음료를 만들기 위해서 과정을 살펴보면

- 물 끓이기 -> 재료 넣기 -> 음료 만들기 -> 컵에 붓기

과정으로 정리 할 수 있습니다. 만약 커피나 녹차를 만들 경우,


커피의 경우 - 물 끓이기 -> 커피 넣기 -> 커피 만들기 -> 컵에 붓기

녹차의 경우 - 물 끓이기 -> 녹차가루 넣기 ->  녹차 만들기 -> 컵에 붓기 

와 같은 과정이 되겠죠


이 중에서 중간 과정인 재료넣기 과정과 만들기 과정은 하위(서브) 클래스에서 추상메서드를 실제로 구현을 하게됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Coffee : Beverage
    {
        protected override void addCondiments()
        { 
            Console.WriteLine("커피 넣기");            
        } 
 
        protected override void makeBeverage()
        {
            Console.WriteLine("커피 맛있게 만들기");
        }
    }
 
cs


녹차도 동일 과정이라고 보시면 됩니다.

위와 같이 중간 과정을 실제로 구현을 합니다.


1
2
3
4
5
            Beverage cf = new Coffee();
            cf.PrepareRecipe("커피");            
 
            Beverage gt = new GreenTea();
            gt.PrepareRecipe("녹차");
cs


이제 호출 할 때는 상위 클래스인 Beverage의 템플릿 메서드인 PrepareRecipe 메서드를 호출하여 결과물을 보면

위와 같이 나옵니다.


이 때 추상 메서드로 선언되어 하위 클래스에서 알맞게 확장할 수 있도록 선언된 메서드를 훅(Hook) 메서드라고 합니다.


해당 패턴은 상위 클래스에서 하위 클래스의 흐름을 제어한다는 특징이 있습니다.


반응형
Comments