블링블링 범블링

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

Technology/객체 지향 디자인 패턴

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

뻠스키 2018. 4. 18. 10:26

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



템플릿메서드패턴이란 구체적인 구현은 다르지만 전체적인 알고리즘의 골격이 같은 경우 적용하는 패턴을 말한다. 템플릿메서드패턴은 상위클래스에서 처리의 흐름을 제어하고, 하위클래스에서 처리의 내용을 구체화한다. 여러 클래스에서 공통되는 사항은 상위 추상클래스에서 구현하고, 각각의 상세부분은 하위 클래스에서 구현하는 특징을 가지고 있다. 

때문에 템플릿메서드 패턴은 코드의 중복을 줄이고, 리팩토링에 유리한 패턴으로 상속을 통한 확장 개발 방법이다. 템플릿메서드 패턴은 주로 전략패턴과 가장 많이 사용되는 패턴 중에 하나다.


예시를 통해서 템플릿메서드패턴을 적용해보자.



가장 대표적인 예로 커피와 차를 만드는 과정이 있다. 커피를 만드는 과정은 물을 끓인다->커피를 넣는다 ->커피를 만든다-> 완성이 있고, 차도 마찬가지로 물을 끓인다->차를 넣는다 ->차를 만든다-> 완성과정을 거친다. 하지만 두 과정은 재료가 다를 뿐 전체적인 과정은 똑같다. 각각 했을 경우 같은 코드를 두 번 쓰게 되버린다. 이러한 경우에 템플릿메서드패턴을 적용하면 중복코드를 최소화할 수 있다.


다음 그림은 템플릿메서드를 적용한 클래스다이어그램과 소스코드다.



[abstract Beverage Class]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public abstract class Beverage {
     
    public Beverage() {
    }
     
    private void boilwater() {
        System.out.println("물끓이기");
    }
    private void finishProcess() {
        System.out.println("마무리하기");
    }
     
    protected abstract void putSomething();
    protected abstract void makeSomething();
 
    public void process() {
        boilwater();
        putSomething();
        makeSomething();
        finishProcess();
    }
 
}


[Coffe Class]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Coffee extends Beverage {
 
    @Override
    protected void putSomething() {
        System.out.println("커피를 넣는다");
         
    }
 
    @Override
    protected void makeSomething() {
        System.out.println("커피를 만든다");
    }
     
}


[Tea Class]

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Tea extends Beverage {
 
    @Override
    protected void putSomething() {
        System.out.println("차를 넣는다");
    }
 
    @Override
    protected void makeSomething() {
        System.out.println("차를 만든다");
    }
     
}


[Main]

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
 
    public static void main(String[] args) {
         
    Beverage coffee = new Coffee();
        Beverage tea = new Tea();
         
        coffee.process();
        tea.process();
    }
 
}


템플릿메서드패턴은 전략패턴과 마찬가지로 상세구현을 하지않고 추상화하므로써 알고리즘을 캡슐화하는 과정을 거친다. 커피와 차를 만드는 과정을 음료라는 속성으로 묶어 추상클래스를 만들었다. "물을 끓인다". "마무리한다"라는 공통 메서드는 직접적으로 구현을 하고, 그 외 음료에 따라서 달라지는 부분은 추상메서드로 만들어서 하위클래스에서 상세구현을 하였다. 


이 패턴을 적용하면서 putSomething()과  makeSomething()은 protected로 제한한 이유는 메서드를 하위클래스에서만 호출되기 때문에 private가 아닌 protected로 지정해준다.

일반적인 경우에 하위 클래스에서 상위 클래스의 기능을 재사용할지 여부를 결정하면서 하위클래스가 흐름을 결정을 한다. 하지만 템플릿 메서드 패턴의 특징은 상위 클래스에서 흐름제어를 한다는 점이다.

 

결과적으로 템플릿메서드를 이용하면 알고리즘 구조는 그대로 유지하면서 서브 클래스에서 특정 단계를 재정의 할 수 있다는 장점이 있다. 하지만 템플릿메서드에서 추가적으로 알야할 개념이 있다. 


훅(hook) method인데 훅 메서드란 추상 클래스에 들어있는, 아무 일도 하지 않거나, 기본 행동을 정의하는 메서드로 하위 클래스에서 오버라이드할 수 있다. 추상메서드는 반드시 하위클래스에 재정의를 해야하는 강제성을 가지고 있지만 훅 메서드는 강제성이 없다. 필요에 따라 하위클래스에서 재정의를 할 수 있다. 상위 클래스에서는 훅메서드가 제어대상이 되는 확장 지점이지만 하위 클래스에서는 확장 기능을 구현할 위치가 된다.


템플릿메서드패턴은 전략패턴과 비슷한점이 많다. 가장 두드러진 차이점은 전략패턴은 핵심적인 로직을 캡슐화하고 템플릿메서드패턴은 일련의 과정을 캡슐화한다는 점에서 다르다고 할 수 있다.



참조 위키디피아 블로그 훅메서드

출처 : http://meylady.tistory.com


Comments