본문으로 바로가기

Templete method pattern

category Design Pattern 2018. 10. 11. 16:01

템플릿 메소드 패턴이란?

상위 클래스에서 처리의 흐름(알고리즘)을 제어하며, 하위클래스에서 처리의 내용을 구체화한다.

여러 하위 클래스에서 공통적으로 사용되는 부분은  상위 클래스에서 구현하고, 기능은 같지만 구체적인 기능이 조금씩 다른 부분은

하위 클래스에서 구현한다.


요약

1. 상위 클래스는 추상클래스

2. 공통적인 부분은 상위 클래스에서 구현

3. 상이한 부분은 추상 메소드로 선언

4. 하위 클래스는 상위 추상 클래스를 상속받아 상이한 부분을 구현


언제사용하나?

행위의 흐름은 같지만 내부적인 부분에서 조금씩 차이가 있을 경우



hook method

추상 클래스에서 선언되는 메소드

기본적인 내용만 구현되어 있거나 아무 코드도 들어 있지 않은 메소드(빈 깡통)


서브 클래스에서 알고리즘의 특정부분이 선택적으로 적용되다던가 할경우 후크를 사용



예제)


처리의 흐름(알고리즘)

1. 메뉴를 보고

2. 먹을 음식을 선택한 후

3. 주문하고

4. 먹는다



예제 설명)

사람들은 식당에 들어가면 메뉴판을 보고 먹을 음식을 정한 후 주문하고 먹는다.

그런데 사람들 중에서는 이런 사람이 있다. 중국집을 가면 무조건 짬뽕을 먹는 사람(필자가 그렇다..)

이런 경우 메뉴판을 볼 필요가 없다.


또 단골집의 경우 주문할 때 늘 먹던걸로 주세요! 

라고 말할 수도 있다.


이런경우  처리의 흐름은 동일하지만 내부의 상세한 부분은 사람마다 다를 것이다.

이런경우 templete method pattern으로 설계할 경우 편리하다.



예제 소스)

abstract class Dinner {    //상위 클래스


//field

protected boolean okcard;

// method

protected abstract void menu();    //메뉴를 보는 멤버 메소드(사람 마다 달리질 수 있는 부분)


protected abstract void select();    //먹을 음식을 선택하는 멤버 메소드(사람 마다 달리질 수 있는 부분)


protected void order() {       

System.out.println("사장님 이거 주세요!");    //주문하는 멤버 메소드(주문은 무조건 공통적으로 해야한다.)

}


protected void eat() {

System.out.println("냠냠");      //나온 음식을 먹는 멤버 메소드(거는건 무조건 공통적으로 해야한다.)

}

protected void cal(boolean card) {

if(card) {

System.out.println("카드 결제할 게요.");

}

else {

System.out.println("카드안돼요? 현금여기요..");

}

}

//hook method

protected abstract boolean okCard(boolean okcard){

this.okcard = okcard;

 return this.okcard;

 }


//templete method    //처리의 흐름을 담당할 templete method

void haveDinner() {

menu();

select();

order();

eat();

cal(okCard(okcard));

}

}


class Sunguk extends Dinner {    //하위 클래스


//constructor

public Sunguk(boolean okcard) {

okCard(okcard);

}

//method

@Override

protected void menu() {      //달라질 수 있는 부분을 재정의

System.out.println("난 메뉴안봐");


}


@Override

protected void select() {      //달라질 수 있는 부분을 재정의

System.out.println("난 짬뽕만 먹어");


}


}


public class TemplateMethodPattern {    //실행할 메인 클래스


public static void main(String[] args) {

Sunguk uk = new Sunguk(true);

uk.haveDinner();


}


}


출력결과


후크메소드로 flase를 주었을 경우

------------------------------------

난 메뉴안봐

난 짬뽕만 먹어

사장님 이거 주세요!

냠냠

카드안돼요? 현금여기요..

------------------------------------




후크메소드로 true를 주었을 경우

------------------------------------

난 메뉴안봐

난 짬뽕만 먹어

사장님 이거 주세요!

냠냠

카드 결제할 게요.

------------------------------------




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

Observer Pattern  (0) 2018.10.11