본문

Template Method Pattern

반응형

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

 

 

이미지 출처: keichee.tistory.com

 

 

💡 Animal.java

public abstract class Animal {

    // 템플릿 메서드 playWithOwner()
    public void playWithOwner() {
        System.out.println("귀염둥이 이리온");

        play();
        runSomething();
        System.out.println("잘했어");
    }

    // 추상 메서드
    abstract void play();

    // Hook(갈고리) 메서드
    void runSomething() {
        System.out.println("꼬리 살랑 살랑~");
    }
}

 

 

💡 Dog.java

public class Dog extends Animal {

    @Override
    // 추상 메서드 오버라이딩
    void play() {
        System.out.println("멍! 멍!");
    }

    @Override
    // Hook(갈고리) 메서드 오버라이딩
    void runSomething() {
        System.out.println("멍! 멍! 꼬리 살랑 살랑~");
    }
}

 

💡 Cat.java

public class Cat extends Animal {

    @Override
    // 추상 메서드 오버라이딩
    void play() {
        System.out.println("야옹~ 야옹~");
    }

    @Override
    // Hook(갈고리) 메서드 오버라이딩
    void runSomething() {
        System.out.println("야옹~ 야옹~ 꼬리 살랑 살랑");
    }

}

 

 

💡 TemplateMethodPattern.java

public class TemplateMethodPattern {

    public static void main(String[] args) {
        Animal bolt = new Dog();
        Animal kitty = new Cat();

        bolt.playWithOwner();

        System.out.println();
        System.out.println();

        kitty.playWithOwner();

    }
}

 

💡 결과

귀염둥이 이리온
멍! 멍!
멍! 멍! 꼬리 살랑 살랑~
잘했어


귀염둥이 이리온
야옹~ 야옹~
야옹~ 야옹~ 꼬리 살랑 살랑
잘했어
 

상위 클래스인 Animal에는 템플릿(견본)을 제공하는 playWithOwner() 메서드와 하위 클래스에게 구현을 강제하는 play() 추상 메서드, 하위 클래스가 선택적으로 오버라이딩할 수 있는 runSomething() 메서드가 있다. 하위 클래스인 DogCat상위 클래스인 Animal에서 구현을 강제하고 있는 play() 추상메서드를 반드시 구현해야한다. runSomething() 메서드는 선택적으로 오버라이딩할 수 있다. 이처럼 상위 클래스에 공통 로직을 수행하는 템플릿 메서드와 하위 클래스에 오버라이딩을 강제하는 추상 메서드 또는 선택적으로 오버라이딩할 수 있는 훅(Hook) 메서드를 두는 패턴을 템플릿 메서드 패턴이라고 한다.

 

 템플릿 메서드 패턴의 구성 요소   상위 클래스


 Animal 
 하위 클래스


 Dog / Cat 
 템플릿 메서드
 공통 로직을 수행, 로직 중에 하위 클래스에서 
 오버라이딩한 추상 메서드/훅 메서드 호출 
 playWithOwner()
 템플릿 메서드에서 호출하는 추상 메서드
 하위 클래스가 반드시 오버라이딩해야 한다. 
 play()   오버라이딩 필수
 템플릿 메서드에서 호출하는 훅(Hock, 갈고리) 메서드
 하위 클래스가 선택적으로 오버라이딩한다.
 runSomething()  오버라이딩 선택 

 

 

 

 

반응형

공유

댓글