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

최진민·2021년 11월 17일
0

디자인 패턴

목록 보기
9/10
post-thumbnail
  • 정의
  • 사용 이유
  • 구현

🛶 1. 템플릿 메서드 패턴 ?

  • 템플릿 메서드 패턴 (Template Method Pattern)

    • 여러 클래스에서 변하지 않고 공통으로 사용되는 기능(method)을 상위 클래스에서 정의하고 자주 변경되는 기능은 하위 클래스에서 정의

    • 구조

      • AbstractClass : 상위 클래스
        • templateMethod() : 변하지 않는 공통 기능
      • ConcreteClass : 하위 클래스
        • hook() : 자주 변경되거나 확장되는 기능


🛥 2. 사용 이유

  • 김밥을 예로 들어보자.

    • 김밥은 , 이라는 중심 재료와 부수적인 재료들로 이루어진다.
  • 야채 김밥

    public class NonVegetableKimbab {
        public void makeVagetableKimbab() {
            addKim();
            addRice();
            addVegetable();
        }
    
        private void addVegetable() {
            System.out.println("야채 추가");
        }
    
        private void addRice() {
            System.out.println("밥 추가");
        }
    
        private void addKim() {
            System.out.println("김 추가");
        }
    }
  • 참치 김밥

    public class NonTunaKimbab {
        public void makeTunaKimbab() {
            addKim();
            addRice();
            addTuna();
        }
    
        private void addTuna() {
            System.out.println("참치 추가");
        }
    
        private void addRice() {
            System.out.println("밥 추가");
        }
    
        private void addKim() {
            System.out.println("김 추가");
        }
    }
  • 손님

    public class Guest {
        public static void main(String[] args) {
            NonVegetableKimbab nonVegetableKimbab = new NonVegetableKimbab();
            NonTunaKimbab nonTunaKimbab = new NonTunaKimbab();
    
            System.out.println("****야채 김밥 추가****");
            nonVegetableKimbab.makeVagetableKimbab();
            System.out.println("****참치 김밥 추가****");
            nonTunaKimbab.makeTunaKimbab();
        }
    }
    
    print >>>
    ****야채 김밥 추가****
    김 추가
    밥 추가
    야채 추가
    ****참치 김밥 추가****
    김 추가
    밥 추가
    참치 추가
    • NonVegetableKimbabNonTunaKimbab 두 클래스 중, addKim()addRice()는 중복된다. 김밥의 종류가 많아질수록 중복 메서드도 많이지기 마련.
    • 템플릿 메서드 패턴은 중복되는 기능을 하나로 묶어 객체의 유연한 확장 및 변경을 꾀할 수 있다.


🛩 3. 구현

  • 김밥 (Abstract Class)

    public abstract class Kimbab {
        protected void makeKimbab() {
            addKim();
            addRice();
            addAnother();
        }
    
        private void addKim() {
            System.out.println("김 추가");
        }
    
        private void addRice() {
            System.out.println("밥 추가");
        }
    
        abstract void addAnother();
    }
    • templateMethod()
      • addKim()
      • addRice()
    • hook()
      • addAnother()
  • 야채 김밥 (ConcreteClass)

    public class VegetableKimbab extends Kimbab {
        @Override
        void addAnother() {
            System.out.println("야채 추가");
        }
    }
  • 참치 김밥 (ConcreteClass)

    public class TunaKimbab extends Kimbab {
        @Override
        void addAnother() {
            System.out.println("참치 추가");
        }
    }
  • 손님

    public class Guest {
        public static void main(String[] args) {
            Kimbab vegetableKimbab = new VegetableKimbab();
            Kimbab tunaKimbab = new TunaKimbab();
    
            System.out.println("****야채 김밥 추가****");
            vegetableKimbab.makeKimbab();
    
            System.out.println("****참치 김밥 추가****");
            tunaKimbab.makeKimbab();
        }
    }
    
    print >>>
    ****야채 김밥 추가****
    김 추가
    밥 추가
    야채 추가
    ****참치 김밥 추가****
    김 추가
    밥 추가
    참치 추가
  • 여러 종류의 김밥이 추가되어도 공통 기능(addKim(), addRice())은 변경되지 않으며, 새로운 서브 클래스필요한 기능을 유연하게 추가할 수 있다.

profile
열심히 해보자9999

0개의 댓글