본문 바로가기

PROGRAMMING/Design Pattern

[GoF] 템플릿 메서드 (Template Method) 패턴

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

알고리즘의 일부 단계를 서브 클래스로 위임하여, 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계를 재정의 할 수 있도록 합니다.


 

객체 지향 프로그래밍에서의 클래스는 상속을 통해 메소드를 재정의할 수 있다. 이를 통해 클래스를 상속함으로써 다른 알고리즘을 구현할 수 있는데, 이 알고리즘이 서로 비슷하다 하더라도 다시 재정의 해야만 한다. 이런 클래스의 상속에 대한 한계적인 부분을 템플릿 메서드 패턴을 통해 해결할 수 있다.

템플릿 메서드 (Template Method) 패턴은 알고리즘을 템플릿화 하여, 상위 클래스에서 알고리즘의 뼈대만 정의하고 구체적인 처리는 추상화하여 상속을 통해 구현할 수 있도록 하는 패턴이다. 상위 클래스의 메서드에선 알고리즘의 공통적인 부분을 작성하고 변형이 필요한 부분은 추상화된 메소드를 호출하여 하위 클래스에서 알고리즘에 대한 구현을 위임할 수 있도록 한다.

템플릿 메서드 패턴을 사용하면, 알고리즘의 공통적인 부분은 상위 클래스에서만 정의되므로 코드를 재사용할 수 있게 되고, 상속을 통해 알고리즘의 처리 부분을 유용하게 확장할 수 있게 된다. 또한, 상위 클래스에서는 알고리즘의 구조를 파악할 수 있지만, 실제로 그 알고리즘이 어떻게 처리되는지에 대한 내용은 하위 클래스로 숨길 수 있게 된다. 하지만, 템플릿 메서드 패턴으로 인해 구현해야 할 메서드가 늘어나 클라이언트가 이해하기 어려워질 수 있다.

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
27
28
29
30
31
32
33
34
public class PatternTemplateMethod
{
    public abstract class AbstractClass
    {
        public void TemplateMethod()
        {
            PrimitiveA();
            PrimitiveB();
        }
 
        protected abstract void PrimitiveA();
        protected abstract void PrimitiveB();
    }
 
    public class SubClass : AbstractClass
    {
        protected override void PrimitiveA()
        {
            Console.WriteLine("Operate PrimitiveA in SubClass");
        }
 
        protected override void PrimitiveB()
        {
            Console.WriteLine("Operate PrimitiveB in SubClass");
        }
    }
 
    public static void Main(string[] args)
    {
        AbstractClass abstractClass = new SubClass();
 
        abstractClass.TemplateMethod();
    }
}
cs

1
2
3
Operate PrimitiveA in SubClass
Operate PrimitiveB in SubClass
Press any key to continue . . .
cs


'PROGRAMMING > Design Pattern' 카테고리의 다른 글

[GoF] 방문자 (Visitor) 패턴  (0) 2019.03.09
[GoF] 중재자 (Mediator) 패턴  (0) 2019.03.09
[GoF] 반복자 (Iterator) 패턴  (0) 2019.03.09
[GoF] 전략 (Strategy) 패턴  (0) 2019.03.09
[GoF] 해석자 (Interpreter) 패턴  (0) 2019.03.09