템플릿 메소드 패턴은 부모 클래스에서 알고리즘을 정의하나, 해당 알고리즘을 변경하지 않고 하위 클래스에서 특정 알고리즘을 재정의하는 패턴입니다.
예제
@Slf4j
public abstract class Animal {
public void questionAboutHowToTalk(){
log.info("이 동물은 누구일까요?");
log.info("힌트: 소리를 잘 들어보세요.");
sound();
log.info("누구일까요?");
}
protected abstract void sound();
}
부모 클래스 Animal에 알고리즘을 정의했습니다. sound() 메소드는 Animal을 상속 받은 자식 클래스에서 오버라이딩 할 것입니다.
@Slf4j
public class Dog extends Animal{
@Override
protected void sound() {
log.info("멍멍!");
}
}
@Slf4j
public class Cat extends Animal{
@Override
protected void sound() {
log.info("야옹~");
}
}
자식 클래스들입니다. 각각 Animal을 상속 받아, sound() 메소드를 오버라이딩 했습니다.
테스트 해보겠습니다.
public class TemplateMethodPatternTest {
@Test
void templatePattern(){
Animal dog = new Dog();
dog.questionAboutHowToTalk();
Animal cat = new Cat();
cat.questionAboutHowToTalk();
}
}
결과
17:26:50.810 [Test worker] INFO remind.pattern.template.Animal - 이 동물은 누구일까요?
17:26:50.813 [Test worker] INFO remind.pattern.template.Animal - 힌트: 소리를 잘 들어보세요.
17:26:50.814 [Test worker] INFO remind.pattern.template.Dog - 멍멍!
17:26:50.814 [Test worker] INFO remind.pattern.template.Animal - 누구일까요?
17:26:50.814 [Test worker] INFO remind.pattern.template.Animal - 이 동물은 누구일까요?
17:26:50.814 [Test worker] INFO remind.pattern.template.Animal - 힌트: 소리를 잘 들어보세요.
17:26:50.814 [Test worker] INFO remind.pattern.template.Cat - 야옹~
17:26:50.814 [Test worker] INFO remind.pattern.template.Animal - 누구일까요?
상위 클래스에서 알고리즘을 정의했고, 하위 클래스에서 알고리즘의 일부를 재정의했습니다. 그 결과로 각 강아지와 고양이는 고정적인 알고리즘 가운데 개별로 재정의한 <멍멍!>과 <야옹~>이 출력되었습니다.
장단점
장점:
- 코드 중복 최소화: 템플릿 메소드 패턴은 알고리즘의 공통 부분을 상위 클래스의 추상 메소드로 정의하므로, 하위 클래스에서 이를 재사용 가능합니다. 이를 통해 코드의 중복을 최소화할 수 있습니다.
- 유연성과 확장성: 알고리즘의 구조를 정의하는 상위 클래스와 각 일부 알고리즘을 구현하는 하위 클래스로 구성되기 때문에, 각 단계를 독립적으로 변경하거나 확장할 수 있습니다. 즉, 알고리즘의 일부를 변경해도 전체 구조를 수정하지 않아도 되므로 유연성과 확장성이 높아집니다.
단점:
- 상속이란 제약 발생: 템플릿 메소드 패턴은 상속을 사용하기 때문에, 하위 클래스에서 상위 클래스의 메소드를 재정의해야 합니다. 이로 인해 클래스 간의 강한 결합도가 발생할 수 있고, 상속이란 제약을 갖습니다.
- 알고리즘 구조 변경의 까다로움: 템플릿 메소드 패턴은 알고리즘의 구조를 미리 정의하고 하위 클래스에서 구체적인 구현을 제공하는 방식이기 때문에, 알고리즘의 구조를 변경해야 하는 경우에는 상위 클래스의 변경이 필요하며, 이는 다른 하위 클래스들에도 영향을 줄 수 있습니다.
'데일리 공부' 카테고리의 다른 글
코드 가독성을 높이는 방법 : 좋은 변수 이름 짓기 (0) | 2023.03.23 |
---|