[6단원]디자인 패턴 - 템플릿 메서드 패턴 ( Template Method Pattern)

템플릿 메서드 패턴

  • 알고리즘 구조를 메서드에 정의하고, 그 일부 단계를 서브 클래스에서 구현할 수 있도록 하는 디자인 패턴

코드예시

  1. 적용전
    package org.example.templateMethodPattern;
    
    public class Dog {
        public void playWithOwner() {
            System.out.println("귀염둥이 이리온...");
            System.out.println("멍!멍!");
            System.out.println("꼬리 살랑 살랑~");
            System.out.println("잘했어");
        }
    }
    package org.example.templateMethodPattern;
    
    public class Cat {
        public void playWithOwner() {
            System.out.println("귀염둥이 이리온...");
            //
            System.out.println("야옹~ 야옹~");
            //
            System.out.println("꼬리 살랑 살랑~");
            System.out.println("잘했어");
        }
    }
    • 야옹 ~ 멍멍 ~ 말고는 동일한 소스이다.
    • 상속으로 해당 부분을 리팩토링이 가능
  1. 적용 후
    package org.example.templateMethodPattern;
    
    public abstract class Animal {
        // 템플릿 메서드
        public void playWithOwner() {
            System.out.println("귀염둥이 이리온...");
            play();
            runSomething();
            System.out.println("잘했어");
        }
        
        // 추상 메서드
        abstract void play();
        
        // Hook(갈고리) 메서드
        void runSomething() {
            System.out.println("꼬리 살랑 살랑~");
        }
    }
    package org.example.templateMethodPattern;
    
    public class Dog extends Animal {
        
        @Override
        void play() {
            System.out.println("멍!멍!");
        }
        
        @Override
        void runSomething() {
            System.out.println("멍!멍! 꼬리 살랑 살랑~");
        }
    }
    package org.example.templateMethodPattern;
    
    public class Cat extends Animal {
        
        @Override
        void play() {
            System.out.println("야옹~ 야옹~");
        }
        
        @Override
        void runSomething() {
            System.out.println("야옹~ 야옹~ 꼬리 살랑 살랑~");
        }
    }
    package org.example.templateMethodPattern;
    
    public class Driver {
        public static void main(String[] args) {
            Animal bolt = new Dog();
            Animal kitty = new Cat();
            
            bolt.playWithOwner();
            
            System.out.println();
            System.out.println();
            
            kitty.playWithOwner();
        }
        
    }
    • 클래스 다이어그램
    • 시퀀스 다이어그램

    구성요소 동작 원리

    1. 템플릿 메서드
      • 슈퍼클래스에 위치한 메서드
      • 공통된 로직 담당
      • 서브 클래스에서 구현되거나 선택적으로 오버라이딩될 수 있는 메서드 호출함
    1. 추상 메서드
      • 템플릿 메서드에서 호출되는 메서드
      • 서브 클래스가 반드시 구현해야 하는 메서드
    1. 훅 메서드
      • 템플릿 메서드가 호출되는 메서드
      • 서브 클래스가 선택적으로 구현가능
      • 오버라이딩 하지 않더라도 기본 로직에 문제가 없어야함

장단점

  1. 장점
    • 코드의 재사용성 증대
    • 슈퍼 클래스와 서브 클래스간의 결합도가 낮아짐 → 유지보수성 증대
    • DIP 준수 → 객체지향 설계의 강화
  1. 단점
    • 추상 메서드가 많아지면 복잡성 증대
    • 슈퍼 클래스의 변경이 서브 클래스에 영향을 미칠 수 있음.


Uploaded by N2T