본문
Template Method Pattern
프로그래밍/디자인패턴 2016. 1. 15. 19:18
반응형
상위 클래스의 견본 메소드에서 하위 클래스가 오버라이딩한 메소드를 호출하는 패턴
💡 Animal.java
public abstract class Animal {
// 템플릿 메서드 playWithOwner()
public void playWithOwner() {
System.out.println("귀염둥이 이리온");
play();
runSomething();
System.out.println("잘했어");
}
// 추상 메서드
abstract void play();
// Hook(갈고리) 메서드
void runSomething() {
System.out.println("꼬리 살랑 살랑~");
}
}
💡 Dog.java
public class Dog extends Animal {
@Override
// 추상 메서드 오버라이딩
void play() {
System.out.println("멍! 멍!");
}
@Override
// Hook(갈고리) 메서드 오버라이딩
void runSomething() {
System.out.println("멍! 멍! 꼬리 살랑 살랑~");
}
}
💡 Cat.java
public class Cat extends Animal {
@Override
// 추상 메서드 오버라이딩
void play() {
System.out.println("야옹~ 야옹~");
}
@Override
// Hook(갈고리) 메서드 오버라이딩
void runSomething() {
System.out.println("야옹~ 야옹~ 꼬리 살랑 살랑");
}
}
💡 TemplateMethodPattern.java
public class TemplateMethodPattern {
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) 메서드를 두는 패턴을 템플릿 메서드 패턴이라고 한다.
템플릿 메서드 패턴의 구성 요소 | 상위 클래스 Animal |
하위 클래스 Dog / Cat |
템플릿 메서드 공통 로직을 수행, 로직 중에 하위 클래스에서 오버라이딩한 추상 메서드/훅 메서드 호출 |
playWithOwner() | |
템플릿 메서드에서 호출하는 추상 메서드 하위 클래스가 반드시 오버라이딩해야 한다. |
play() | 오버라이딩 필수 |
템플릿 메서드에서 호출하는 훅(Hock, 갈고리) 메서드 하위 클래스가 선택적으로 오버라이딩한다. |
runSomething() | 오버라이딩 선택 |
반응형
댓글