개발놀이터

템플릿 메서드 패턴 본문

리팩토링/GOF 디자인패턴

템플릿 메서드 패턴

마늘냄새폴폴 2022. 7. 5. 18:56

템플릿 메서드 패턴은 무엇인가?

템플릿 메서드 패턴은 특정 작업을 처리하는 일부분을 서브클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용을 바꾸는 패턴을 말한다. 

 

템플릿 메서드 패턴을 사용하면 중복 코드를 줄일 수 있고, 자식 클래스의 역할을 줄여 핵심 로직의 관리가 용이하게 할 수 있으며, 코드를 객체지향적으로 구성할 수 있다는 장점이 있다.

 

하지만 추상메서드가 많아지면서 클래스의 관리가 힘들어질 수 있고, 클래스들의 관계와 코드가 꼬일 염려가 있다는 단점이 있다. 

 

템플릿 메서드 패턴은 클라이언트가 알고리즘의 특정 단계만 제어하고 전체 알고리즘이나 구조를 변경할 수 없도록 하고싶을 때나, 특정 단계에서 구현만 다르고 다른 대부분은 동일한 동작을 하는 경우에 사용하면 좋다. 

 

템플릿 메서드 패턴 구조

템플릿 메서드 패턴 예제

우리는 특정 비즈니스 로직의 실행 시간을 알고싶은 상황이다. 그래서 비즈니스 로직 처음과 끝에 시간을 측정하는 로직을 추가할 것이다. 

 

1. AbstractTemplate 생성 (추상클래스)

@Slf4j
public abstract class AbstractTemplate {
	
    public void execute() {
    	long startTime = System.currentTimeMillis();
        //비즈니스 로직 실행
        call();	//상속
        //비즈니스 로직 종료
        long entTime = System.currentTimeMillis();
        long resultTime = endTime - startTime;
        log.info("resultTime = {}", resultTime);
    }
    
    protected abstract void call();
}

추상클래스에 대한 자세한 내용은 본 포스팅에선 생략한다. 자세한 내용은 아래의 링크 참조

https://coding-review.tistory.com/115

 

추상클래스와 인터페이스

도입 GOF 디자인 패턴 중 템플릿 메서드 패턴을 공부하던 중에 공통 로직인 AbstractTemplate를 구성하는 요소중 abstract라는 키워드를 발견하게 되었고 이에 대해 검색을 했더니 기능이 인터페이스랑

coding-review.tistory.com

 

2. SubClassLogic1, SubCalssLogic2 클래스 생성

@Slf4j
public class SubClassLogic1 extends AbstractTemplate {
	
    @Override
    protected void call() {
    	log.info("비즈니스 로직1 실행");
    }
}
@Slf4j
public class SubClassLogic2 extends AbstractTemplate {
	
    @Override
    protected void call() {
    	log.info("비즈니스 로직2 실행");
    }
}

 

3. 테스트코드 작성

@Test
void templateMethodV1() {
	
    AbstractTemplate template1 = new SubClassLogic1();
    template1.execute();
    
    AbstractTemplate template2 = new SubClassLogic2();
    template2.execute();
}

 

4. 실행 결과

 

'리팩토링 > GOF 디자인패턴' 카테고리의 다른 글

프록시 패턴  (0) 2022.07.08
데코레이터 패턴  (0) 2022.07.07
전략 패턴  (0) 2022.07.06