템플릿 메소드(Template method) 패턴이란?
템플릿 메소드 패턴은 행위패턴 중 하나로, 전체 구조에서 공통적인 부분을 제외한 특정 작업을 처리하는 일부분만 서브 클래스에서 각각 재정의하는 패턴이다. 간단하게 예시를 들어 말하자면, A와 B라는 작업이 있으면 추상 클래스에 알고리즘의 공통되는 부분은 구현을 해놓고 A, B 각각이 다른 작업은 추상 메소드로 재정의하는 것이다.
위의 이미지를 보면 상위 클래스에 step1~4를 실행하는, 즉 골격을 잡는 templateMethod()가 있고 이 클래스를 상속받는 ConcreteClass1, ConcreteClass2는 step1~4 중 필요한 것만 오버라이드 해서 재정의하고 있다.
템플릿 메소드 패턴의 장단점?
장점
- 중복 코드를 줄일 수 있다.
- 자식 클래스의 역할을 줄여 핵심 로직의 관리가 용이하다.
- 좀더 코드를 객체지향적으로 구성할 수 있다.
단점
- 추상 메소드가 많아지면서 클래스 관리가 복잡해진다.
- 클래스간의 관계와 코드가 꼬여버릴 염려가 있다.
- 어떤 클라이언트는 알고리즘의 제공된 골격에 맞지 않을 수 있다. (슈퍼클래스의 templateMethod에서 골격을 제한하기 때문)
- 서브클래스를 통한 default step 구현을 막음으로써 Liskov Substitution Principle(LSP, 리스코프 치환원칙: 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 함)을 위반할 수 있다.
언제 사용하면 좋을까?
- 서브 클래스가 알고리즘의 전체 구조가 아닌 특정 스텝만 상속받게 하고 싶을때
- 템플릿 메소드 패턴은 모놀리틱(monolithic)한 알고리즘을 좀더 세부적인 스텝으로 나누게 만들어주기 때문에 서브 클래스가 슈퍼클래스의 전체적인 구조는 건들지 않고 상속받을 수 있게 해준다!
- 일부만 다르고 거의 일치하는 알고리즘을 가진 여러개의 클래스가 있을 때
- 템플릿 메소드 패턴으로 설계하면 서로 다른 부분은 서브 클래스에 남기면서 비슷한 구현은 슈퍼클래스로 올리면서 코드 중복을 피할 수 있다.
예시
학교 & 회사 이렇게 객체가 2개 있다면 학교를 가고 회사를 가는 로직에는
공통되는 부분은 '일어난다', '씻는다'가 있고
서로 다른 부분은 '버스를 타고 간다' vs '자차를 타고 간다' 라고 했을 때 구현은 다음과 같다.
공통적인 로직을 묶는 추상 클래스
public abstract Destination {
public void goDestination() {
wakeUp();
wash();
go();
}
public void wakeUp() {
System.out.println("아침에 일어난다.");
}
public void wash() {
System.out.println("샤워를 한다.");
}
// 서로 다른 로직은 추상 메소드로 정의
public abstract void go();
}
학교 클래스
public class School extends Destination {
@Override
public void go() {
System.out.println("버스를 타고 간다.");
}
}
회사 클래스
public class Company extends Destination {
@Override
public void go() {
System.out.println("자차를 타고 간다.");
}
}
Reference
728x90
반응형
'TIL' 카테고리의 다른 글
MapStruct (+ ModelMapper, Reflection) 사용법 (0) | 2022.09.05 |
---|---|
CQRS(Command Query Responsibility Segregation) 패턴 (0) | 2022.08.12 |
Express 폴더 구조 (0) | 2021.08.12 |
Swagger 간단 사용법 (0) | 2021.07.03 |
애자일 방법론, HTTP 상태코드 (0) | 2021.06.22 |