본문 바로가기

용어정리/#디자인패턴

용어정리-[#디자인패턴] 5.Template Method Pattern

[ Template Method Pattern ]

템플릿 메서드 패턴


2018 - 06 - 01


볼트라는 이름의 강아지와 키티라는 이름의 고양이를 키운다고 상상해 보자.


Animal.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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("꼬리 살랑 살랑~");
    }
}
cs
.

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

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

하위 클래스가 선택적으로 오버라이딩할 수 있는 runSomething() 메서드가 있다.



하위 클래스를 포함하는 Dog.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package templateMethodPattern;
 
public class Dog extends Animal {
    @Override
    // 추상 메서드 오버라이딩
    void play() {
        System.out.println("멍! 멍!");
    }
 
    @Override
    // Hook(갈고리) 메서드 오버라이딩
    void runSomething() {
        System.out.println("멍! 멍! 꼬리 살랑 살랑");
    }
}
cs


하위 클래스를 포함하는 Cat.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package templateMethodPattern;
 
public class Cat extends Animal {
    @Override
    // 추상 메서드 오버라이딩
    void play() {
        System.out.println("야옹~ 야옹~");
    }
 
    @Override
    // Hook(갈고리) 메서드 오버라이딩
    void runSomething() {
        System.out.println("야옹~ 야옹~ 꼬리 살랑 살랑");
    }
}
cs



하위 클래스인 Dog과 Cat은

상위 클래스인 Animal에서 구현을 강제하고 있는 play() 추상 메서드를 반드시 구현해야 한다.


Driver

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package templateMethodPattern;
 
public class Driver {
    public static void main(String[] args){
        Animal bolt = new log();
        Animal kitty = new Cat();
 
        bolt.playWithOwner();
 
 
        System.out.println();
        System.out.println();
 
        kitty.playWithOwner();
    }
}
cs


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

이처럼 상위 클래스에 공통 로직을 수행하는 템플릿 메서드와 하위 클래스에 오버라이딩을 강제하는 추상 메서드 또는 선택적으로 오버라이딩 할 수 있는 훅(Hook) 메서드를 두는 패턴을

템플릿 메서드 패턴이라고 한다.


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


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


출처

스프링 입문을 위한 객체 지향의 원리와 이해

김종민 저