개발 etc

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

알통몬_ 2017. 3. 12. 20:53
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

볼트라고 하는 강아지와 키티라는 이름의 고양이를 키운다고 가정해보면, 

볼트,키티와 함께 노는 시간을 보내는 세계를 프로그램으로 표현한다면 

아래 2개의 예제와 같이 2개의 클래스가 필요하겠죠?


예제1)

public class Dog {

public void playWithOwner() {

System.out.println("귀염둥이 이리온...");

System.out.println("야옹~ 야옹~");

System.out.println("꼬리 살랑 살랑~");

System.out.println("잘했어");

}

}


예제2)

public class Cat {

public void playWithOwner() {

System.out.println("귀염둥이 이리온...");

System.out.println("야옹~ 야옹~");

System.out.println("꼬리 살랑 살랑~");

System.out.println("잘했어");

}

}

위 두 예제의 playWithOwner()메서드를 보면 4번째 줄만 빼고 모두 동일하죠?

이 코드를 객체 지향의 상속을 통해 상위 클래스와 하위클래스로 나누고 

싶다는 생각이 들지 않나요?


템플릿 메서드 패턴을 적용해보겠습니다.

예제0) 상위 클래스

package templateMethodPattern;


public abstract class Animal {

// 템플릿 메서드

public void playWithOwner() {

System.out.println("귀염둥이 이리온...");

play();

runSomething();

System.out.println("잘했어");

}


// 추상 메서드

abstract void play();


// Hook(갈고리) 메서드

void runSomething() {

System.out.println("꼬리 살랑 살랑~");

}

}

예제1)하위 클래스

package templateMethodPattern;


public class Dog extends Animal {

@Override

// 추상 메서드 오버라이딩

void play() {

System.out.println("멍! 멍!");

}


@Override

// Hook(갈고리) 메서드 오버라이딩

void runSomething() {

System.out.println("멍! 멍!~ 꼬리 살랑 살랑~");

}

}

예제2)하위 클래스

package templateMethodPattern;


public class Cat extends Animal {

@Override

// 추상 메서드 오버라이딩

void play() {

System.out.println("야옹~ 야옹~");

}


@Override

// Hook(갈고리) 메서드 오버라이딩

void runSomething() {

System.out.println("야옹~ 야옹~ 꼬리 살랑 살랑~");

}

}

예제3) 실제 실행하는 클래스

package templateMethodPattern;


public class Driver {

public static void main(String[] args) {

Animal bolt = new Dog();

Animal kitty = new Cat();


bolt.playWithOwner();


System.out.println();

System.out.println();


kitty.playWithOwner();

}

}

상위 클래스인 Animal에는 템플릿(견본)을 제공하는 playWithOwner()메서드와 

하위 클레스에게 구현을 강제한 play() 추상 메서드, 하위 클래스가 

선택적으로 오버라이딩할 수 있는 runSomething()메서드가 있습니다. 

하위 클래스인 Dog와 Cat은 상위 클래스인 Animal에서 

구현을 강제하고 있는 play() 추상 메서드를 반드시 구현해야 하죠. 

runSomething() 메서드는 선택적으로 오버라이딩 할 수 있습니다.


이렇게 

상위 클래스에 공통 로직을 수행하는 템플릿 메서드와 하위 클래스에 

오버라이딩을 강제흐는 추상 메서드 또는 선택적으로 

오버라이딩할 수 있는 훅(HOOK) 메서드를 두는 패턴을 템플릿 메서드 패턴이라고 해요.


템플릿 메서드를 한 문장으로 정리해보면

-상위 클래스의 견본 메서드에서 하위 클래스가 오버라이딩한 메서드를 호출하는 패턴-

입니다.

반응형