정의[위키피디아]
템플릿 메소드 패턴(template method pattern)은 소프트웨어 공학에서 동작 상의 알고리즘의 프로그램 뼈대를 정의하는 행위 디자인 패턴이다.[1] 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계들을 다시 정의할 수 있게 해준다
예제를 보며 이해하기
1. Dog 와 Cat 클래스가 아래와 같이 존재한다.
- 아래 2개의 클래스는 우는 소리 (멍멍 , 야옹 야옹)를 제외하고는 모두 동일하다.
이럴경우 동일한것과 다른 부분을 구분하여 추상 클래스를 상속받도록 하면 공통 부분을 재사용 할 수 있다.
public class Dog {
public void playWithOwner() {
System.out.println("귀염둥이 이리온...");
System.out.println("멍! 멍!");
System.out.println("꼬리 살랑 살랑~");
System.out.println("잘했어");
}
}
public class Cat{
public void playWithOwner() {
System.out.println("귀염둥이 이리온...");
System.out.println("야옹! 야옹!");
System.out.println("꼬리 살랑 살랑~");
System.out.println("잘했어");
}
}
2. 추상클래스에 공통부분과 다른 부분을 별도의 메서드로 만든다.
- 공통 부분을 메서드로 만들고, 다른 부분을 abstract 로 선언하여 반드시 사용하도록 강제한다.
public abstract class Animal {
// 템플릿 메서드
public void playWithOwner() {
System.out.println("귀염둥이 이리온...");
play();
runSomething();
System.out.println("잘했어");
}
// 추상 메서드
abstract void play();
// Hook(갈고리) 메서드
void runSomething() {
System.out.println("꼬리 살랑 살랑~");
}
}
3. 위 추상 클래스 Animal 을 상속하여 Dog 와 Cat 을 재정의 한다.
public class Dog2 extends Animal {
@Override
// 추상 메서드 오버라이딩
void play() {
System.out.println("멍! 멍!");
}
@Override
// Hook(갈고리) 메서드 오버라이딩
void runSomething() {
System.out.println("멍! 멍!~ 꼬리 살랑 살랑~");
}
}
-------------------
public class Cat2 extends Animal {
@Override
// 추상 메서드 오버라이딩
void play() {
System.out.println("야옹~ 야옹~");
}
@Override
// Hook(갈고리) 메서드 오버라이딩
void runSomething() {
System.out.println("야옹~ 야옹~ 꼬리 살랑 살랑~");
}
}
4. Main()
public class Driver {
public static void main(String[] args) {
Animal bolt = new Dog2();
Animal kitty = new Cat2();
bolt.playWithOwner();
System.out.println();
System.out.println();
kitty.playWithOwner();
}
}
책에서의 정의
- 상위 클래스에 공통 로직을 수행하는 템플릿 메서드와 하위 클래스에 오버라이딩을 강제하는 추상 메서드 또는 선택적으로 오버라이딩 할 수 있는 훅(Hook) 메서드를 두는 패턴을 템플릿 메서드 패턴이라고 한다.
"상위 클래스의 견본 메서드에서 하위 클래스가 오버라이딩한 메서드를 호출하는 패턴"
참고서적 : 스프링 입문을 위하 자바 객체지향의 원리와 이해
'객체지향 (OOP) > 디자인 패턴' 카테고리의 다른 글
전략 패턴(strategy pattern) (0) | 2021.06.30 |
---|---|
팩토리 메서드 패턴(Factory method pattern) (0) | 2021.06.30 |
싱글톤 패턴(Singleton Pattern) (0) | 2021.06.28 |
데코레이터 패턴 (Decorator Pattern) (0) | 2021.06.28 |
프록시 패턴(proxy pattern) (0) | 2021.06.22 |