Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

템플릿 메소드 (Template method) 패턴 본문

디자인패턴

템플릿 메소드 (Template method) 패턴

개발자가되고싶어 2021. 6. 9. 13:28
템플릿 메소드 패턴

 

템플릿 메소드 패턴은 추상클래스와 구현클래스로 작성됩니다.

공통적인 부분은 추상클래스의 일반 메소드로 선언하여 사용하며 구현체 마다 다른 로직이 필요한 메소드는 구현 클래스에서 작성하여 추상클래스에서 호출하는 식으로 동작합니다.

 

코드를 보며 설명해보겠습니다. 토스트를(여기서 말하는 토스트는 먹는 토스트입니다..) 만드는 예제입니다.

예제에는 3단계의 메소드가 있습니다.

1. 빵을 준비하는 단계

2. 토핑을 소스에 뭍히는 단계

3. 토스트를 만드는 단계

 

예제가 순서는 크게 중요하지 않아 보이나 메소드의 순서에 따라 동기적인 프로세스를 만들 경우를 생각해 본다면 한번 정의만 잘 해놓으면 구현체를 구현하는 과정에서 많은 편의를 느낄 수 있을것 입니다. 기능에만 집중하면 되니까요.

public abstract class AbstractToast {

    //서브 클래스에서 재정의
    protected abstract void topping(Source source);

    //공통된 행동을 하는 메소드
    private void bread(Bread bread) {
        System.out.println(bread.breadType());
    }

    //공통된 행동을 하는 메소드
    private void cook() {
        System.out.println("토스트 만드는중..");
    }

   //필요한 단계의 메소드들을 순서대로 정의하여 호출한다
    public final void makeToast(Bread bread, Source source) {
        bread(bread);
        topping(source);
        cook();
    }
}

먼저 abstract 클래스 내에 구현되어 있는 메소드를 확인해봅시다. 공통된 행동을 하는 메소드로 bread(Bread bread), cook() 메소드가 있습니다. 토스트를 만드는 과정에서 토스트의 빵은 언제든 바뀔수 있으며 어떤 토스트를 만들건 공통적으로 빵이 필요합니다. cook() 메소드 또한 재료들을 조립하여 토스트를 만드는 과정은 공통적으로 필요합니다.

(만드는 과정이 여러개있을수도 있긴 하겠네요.. 오븐에 한번 더 굽는다던가..)

 

protected abstract void topping() 메소드는 추상 메소드입니다. 구현 클래스에서 재정의 하여 사용해야 합니다.

예제에서 하는 역할은 makeToast() 메소드에서 호출때 전달받은 소스 파라미터를 가지고 서브 클래스에서 토핑에 소스를 입혀 주는 역할을 합니다. 아래의 코드처럼요.

public class ChickenToast extends AbstractToast {
    @Override
    protected void topping(Source source) {
        String mix = "치킨토핑에 " + source.source();
        System.out.println(mix);
    }
}

참고로 소스(먹는소스)의 인터페이스와 구현 클래스는 아래와 같이 되어있습니다.

public interface Source {
    String source();
}

public class MustardSource implements Source {
    @Override
    public String source() {
        return "머스타드 소스";
    }
}

 

public class ToastMain {

    public static void main(String[] args) {
        AbstractToast toast = new ChickenToast();
        toast.makeToast(new MilkBread(), new MustardSource());
    }
    
}
우유빵
치킨토핑에 머스타드 소스 추가
토스트 만드는중..

 

위 처럼 템플릿 메소드를 사용할 수 있습니다. 입맛대로 어떤 토스트를 생성할지와 빵과 소스만 선택하면 토스트가 완성됩니다.

 

이처럼 템플릿 메소드 패턴은 알고리즘 뼈대를 정의 할 수 있습니다. 메소드 를 필요한 순서대로 정의만 해놓으면 되니 구현하는 입장에서는 기능에만 집중할 수 있겠군요. 그리고 공통된 기능은 계속해서 구현할 필요도 없을겁니다.

 

틀린 내용은 언제든지 말씀해주세요 피드백은 환영하며 읽어주셔서 감사합니다.