상위 클래스의 견본 메서드에서 하위 클래스가 오버라이딩한 메서드를 호출하는 패턴
클래스 다이어그램을 보면 템플릿 메서드 패턴이 의존 역전 원칙 (DIP) 을 활용
바로 본문으로 들어가겠다 아래의 코드에서 차이점이 보이는가
public class Dog {
public void playWithOwner() {
System.out.println("귀염둥이 이리온");
System.out.println("멍");
System.out.println("꼬리 살랑");
System.out.println("잘했어");
}
}
public class Cat {
public void playWithOwner() {
System.out.println("귀염둥이 이리온");
System.out.println("야옹");
System.out.println("꼬리 살랑");
System.out.println("잘했어");
}
}
울음소리 하나만 다르고 나머지는 다 똑같은 출력문을 가지는 위와 같은 구조를 어떻게 쉽게 정리할까
public abstract class Animal {
public void playWithOwner() {
System.out.println("귀염둥이 이리온");
play();
runSomething();
System.out.println("잘했어");
}
// 추상 메서드
abstract void play();
// Hook(갈고리) 메서드
void runSomething() {
System.out.println("꼬리 살랑");
}
}
public class Dog extends Animal{
@Override
// 추상 메서드 오버라이팅
void play() {
System.out.println("멍");
}
@Override
// Hook(갈고리) 메서드 오버라이딩
void runSomething() {
System.out.println("멍멍 꼬리 살랑");
}
}
class Cat extends Animal{
@Override
// 추상 메서드 오버라이팅
void play() {
System.out.println("야옹");
}
@Override
// Hook(갈고리) 메서드 오버라이딩
void runSomething() {
System.out.println("야옹 꼬리 살랑");
}
}
차이점이 보이는가 어찌보면 그냥 interface 받아와서 메서드 재정의를 강요하는 것과 다른것이 뭐냐라고 볼 수 있지만 우리가 주의깊게 봐야하는 것은 hook 메서드이다 오버라이딩이 가능하지만 강조하진 않는다 이러한 상속(재사용,확장) 구조를 가지는 것을 템플릿 메서드 패턴이다 템플릿 메서드 (playWithOwner)를 실행하면 추상 메서드와 훅 메서드가 사용되는 것을 볼 수 있다..
위의 코드를 요약한 아래 사진으로 마무리 하겠다