본문으로 바로가기

Template Method 패턴이란?

category 프로그래밍/디자인 패턴 2019. 1. 7. 22:39
Template Method

- template 사전적 의미?

: 특정한 모양으로 자를수 있는 금속이나 플라스틱을 말함
: 특정한 모양으로 계속해서 자를수 있다.
: 주형

- Template Method Pattern?

: 변하지 않는 기능은 슈퍼클래스에 만들어두고 자주 변경되며 확장할 기능은 서브클래스에서 만드는 방법 -토비의 스프링
: 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의 하는 패턴 - GoF Design Patterns
: 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 변경 X,특정 단계 수행하는 부분만 바꾸는 패턴


<Worker.java>

1
2
3
4
5
6
7
8
9
10
11
12
package kr.sys4u.TemplateMethod;
 
public abstract class Worker {
    protected abstract void work();
    
    public final void printRoutine() {
        System.out.println("출근!!");
        work();
        System.out.println("퇴근!!");
    }    
}
 
cs


<Nurse.java>


1
2
3
4
5
6
7
8
9
package kr.sys4u.TemplateMethod;
 
public class Nurse extends Worker{
    @Override
    protected void work() {
        System.out.println("환자를 치료합니다.");        
    }
}
 
cs



<Student.java>


1
2
3
4
5
6
7
8
9
package kr.sys4u.TemplateMethod;
 
public class Student extends Worker{
    @Override
    protected void work() {
        System.out.println("공부합니다.");          
    }    
}
 
cs



<Main.java>


1
2
3
4
5
6
7
8
9
10
11
12
package kr.sys4u.TemplateMethod;
 
public class Main {
    public static void main(String[] args) {
        Worker nurse = new Nurse();
        nurse.printRoutine();
        System.out.println("=====================");    
        Worker student = new Student();
        student.printRoutine();
    }
}
 
cs





- 왜 printRoutine() 에 final을 붙였을까?


=>final을 붙이게 되면 하위 클래스에서 Override를 할수없게 된다.

=>printRoutine() 경우 전체적인 흐름(변하지 않는)을 수행하는 구조를 맡는 메소드로서 모든 클래스에서는 공통적으로 사용되는 

    부분이며 또한 printRoutine() 변경이 되면 전체적인 흐름을 방해할수 있기 때문



- 장점


1) 코드중복을 줄일수 있다.

2) 자식객체의 역할을 줄임으로써 핵심로직에 집중할수 있다.

3) 자식 객체 확장에 용이함



- 단점


1) 추상메소드가 너무 많으면 관리가 힘들어진다.

2) 추상클래스 템플릿메소드에서 하위클래스 메소드를 호출(상위->하위)해야하기 때문에 혼선이 생길수 있다.


Anti-Pattern

=> 상속을 하는 패턴이기 때문에  Anti-Pattern이다. " 상속을 지양 " 하는것이  OOP에서 중요하기 때문에

=> why? 상속을 할수록 비대하게 커짐. SRP를 위배할수 있음. SRP를 지키면서 만들수 있지만 너무 많은 일을 하게 됨 

                               (conposition over inheritence) => 상속보단 조합 => 인터페이스를 써라.

=> 비대하게 커지게 되면 메소드가 어디까지 재정의 되어있고 어떤 하위클래스가 가진것인지 한번에 알기 힘들다.

=> why? 

=> 상속이 다형성을 막아버림,다형성 제약이 생김 ( 이 상속 계통으로만 변환이 된다 => 인터페이스를 사용하자 ) 



etc..)

스프링

convention over configuration : 설정보단 관습을 따라라