템플릿 메서드 패턴 (template method pattern)

JunSeong_Park·2023년 1월 1일
0
post-custom-banner

상위 클래스의 견본 메서드에서 하위 클래스가 오버라이딩한 메서드를 호출하는 패턴

클래스 다이어그램을 보면 템플릿 메서드 패턴이 의존 역전 원칙 (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)를 실행하면 추상 메서드와 훅 메서드가 사용되는 것을 볼 수 있다..

위의 코드를 요약한 아래 사진으로 마무리 하겠다

Untitled

출처 : 스프링 입문을 위한 자바

profile
안녕하세요 언어에 구애 받지 않는 개발자가 되고 싶은 박준성입니다
post-custom-banner

0개의 댓글