본문 바로가기

디자인패턴

[디자인패턴] 템플릿메소드(Template Method Pattern)

정의

알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의 하는 패턴이다. 알고리즘이 단계별로 나누어 지거나, 같은 역할을 하는 메소드이지만 여러곳에서 다른형태로 사용이 필요한 경우 유용한 패턴이다.

 

Template Method UML

abstractClass : 부모 클래스에는 전반 과정을 수행하는 메인 메소드가 있다. 세부 메소드를 추상메소드로 갖는다.

concreteClass : 자식클래스는 부모의 추상메소드를 상속받아 오버라이딩 구현한다. 

 

예시)

전통약과를 만드는 과정은 3개의 과정을 순차적으로 진행하여야 한다.

1. 반죽을 만드는 과정

2. 반죽을 기름에 튀겨내는 과정

3. 시럽을 바르는 즙청 과정

 

이 세개의 과정을 어떻게 하느냐에 따라 다양한 약과를 만들 수 있다. 

=> 부모 메소드가 갖는 메인 메소드의 순서를 자식들이 바꿀 순 없지만 세부 메소드를 어떻게 구현하느냐에 따라

순서는 갖지만 다르게 동작한다.

 

전 편에선 이 방식들을 각각 갈아끼워 넣을 수 있는 전략패턴이 사용

다른점은 다양화된 방식을 각각 자식 클래스들에서 오버라이딩 함.

 

왼- 전략 , 오 - 템플릿

 

 

//abstractClass
public abstract class MapView {
    protected abstract void connectMapServer();
    protected abstract void showMapOnScreen();
    protected abstract void moveToCurrentLocation();

    public void initMap() {
        connectMapServer();
        showMapOnScreen();
        moveToCurrentLocation();
    }
}

부모 추상클래스

 

public class NaverMapView extends MapView{
    @Override
    protected void connectMapServer() {
        System.out.println("네이버 지도 서버에 연결");
    }

    @Override
    protected void showMapOnScreen() {
        System.out.println("네이버 지도를 보여줌");
    }

    @Override
    protected void moveToCurrentLocation() {
        System.out.println("네이버 지도에서 현 위로 이동");
    }
}
public class KakaoMapView extends MapView{
    @Override
    protected void connectMapServer() {
        System.out.println("카카오 지도 서버에 연결");
    }

    @Override
    protected void showMapOnScreen() {
        System.out.println("카카오 지도를 보여줌");
    }

    @Override
    protected void moveToCurrentLocation() {
        System.out.println("카카오 지도에서 현 위로 이동");
    }
}

 

부모의 추상메소드를 구현한 자식클래스

 

public class TemplateMethodExample {
    public static void main(String[] args) {
        new NaverMapView().initMap();
        new KakaoMapView().initMap();
    }
}

 

 

네이버맵과 카카오맵은 고통의 과정을 가지고 있지만 그 안의 세부 과정을 다르게 구현하였다.