ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1. 템플릿 메소드 패턴 ( Template Method Pattern )
    DesignPattern 2018. 7. 18. 23:37
    반응형




    다양한 디자인 패턴들이 존재하는데..

    하나하나씩 정리해보자.~





    1. 템플릿 메소드 패턴 ( Template Method Pattern )

      - 상위 부모 클래스에서 작업에 대한 알고리즘을 정의하고 하위 자식 클래스에서 상세한 구현을 하도록 설계하는 패턴입니다.

      - 템플릿 메소드 패턴은 매우 많이 쓰이는 패턴입니다. 아주 다양하고 다른 모양으로 구현하였기에 패턴이 적용되었는지 모를 수 있습니다.

      - 프레임워크를 사용함으로써 작업이 처리되는 방식은 제어할 수 있으면서도, 프레임워크에서 처리하는 알고리즘의 각 단계는 

        프레임워크를 사용하는 사람 마음대로 지정할 수 있어 프레임워크를 만드는 데 아주 훌륭한 디자인 도구입니다. 



    2. 사용 예시

       

      ① CheezeBurger 와 ChikenBurger 의 두개의 클래스가 있습니다.

           ▶ 하지만 코드가 중복되어 있고, 두 클래스가 거의 비슷하니 공통적인 부분을 추상하여 베이스 클래스를 만들어야 합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class CheezeBurger {
        public void prepareBurger() {
            setBread();
            setBeefPatty();
            setCheeze();
            setVeggie();
    setSource();
            setSprite();
        }
        public void setBread() {
            System.out.println("빵을 내려놓는다");
        }
        public void setBeefPatty() {
            System.out.println("고기 패티를 넣는다.");
        }
        public void setCheeze() {
            System.out.println("치즈를 넣는다.");
        }
        public void setVeggie() {
            System.out.println("야채를 넣는다.");
        }
    public void setSource() {
    System.out.println("소스를 넣는다.");
    }
        public void setSprite() {
            System.out.println("스프라이트를 줍니다");
        }
    }
     
    cs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class ChickenBurger {
        public void prepareBurger() {
            setBread();
            setChickenPatty();
            setVeggie();
    setSource();
            setChicken();
        }
        public void setBread() {
            System.out.println("빵을 내려놓는다");
        }
        public void setChickenPatty() {
            System.out.println("치킨 패티를 넣는다.");
        }
        public void setVeggie() {
            System.out.println("야채를 넣는다.");
        }
    public void setSource() {
    System.out.println("소스를 넣는다.");
    }
        public void setCoke() {
            System.out.println("콜라를 줍니다");
        }
    }
     
    cs


       

      ② CheezeBurger와 ChickenBurger 클래스 사이에 공통된 부분을 생각해봅니다.

           1) 빵을 내려놓는다.

           2) 고기 또는 치킨 패티를 넣는다.   -> 패티를 넣는다는 면에서 크게 다르지 않습니다.

           3) 야채를 넣는다.

           4) 소스를 넣는다.

           5) 사이다 또는 콜라를 줍니다.  -> 음료수를 주는 면에서 크게 다르지 않습니다.



       

      ③ prepareBurger() 메소드를 준비합니다.

           ▶ CheezeBurger 와 ChickenBurger를 만들 때와 똑같은 prepareBurger() 메소드를 사용합니다.

               서브클래스에서 이 메소드를 오버라이딩해서 아무렇게나 음료를 만들지 못하도록 final로 선언합니다.

               패티와 음료부분은 setPatty()와 setBeverage()라는 일반화된 메소드로 바꿉니다.    

    1
    2
    3
    4
    5
    6
    7
    final public void prepareBurger() {
            setBread();
            setPatty();
            setVeggie();
            setSource();
            setBeverage();
    }
    cs



         ④ Burger라는 부모 클래스를 만들었습니다.

              ▶ CheezeBurger와 ChickenBurger에서 setPatty(), setBeverage() 메소드를 서로 다른 방식으로 처리해야 하기 때문에 abstract로 선언하였습니다.    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public abstract class Burger {
        public void prepareBurger() {
            setBread();
            setPatty();
            setVeggie();
            setSource();
            setBeverage();
        }
     
        abstract public void setPatty();
        abstract public void setBeverage();
        
        public void setBread() {
            System.out.println("빵을 내려놓는다");
        }
     
        public void setVeggie() {
            System.out.println("야채를 넣는다.");
        }
        public void setSource() {
            System.out.println("소스를 넣는다.");
        }
    }
     
    cs


       

      ⑤ CheezeBurger와 ChickenBurger 클래스를 처리합니다.

           ▶ Buger클래스로부터 상속받습니다. 추상메소드인 setPatty(), setBeverage() 를 각 클래스에 맞게 정의하였습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class CheezeBurger extends Burger{
        public void setCheeze() {
            System.out.println("치즈를 넣는다.");
        }
        @Override
        public void setPatty() {
            System.out.println("고기 패티를 넣는다.");
        }
        @Override
        public void setBeverage() {
            System.out.println("스프라이트를 줍니다");
        }
    }
     
    cs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class ChikenBurger extends Burger{
        @Override
        public void setPatty() {
            System.out.println("치킨 패티를 넣는다.");
        }
     
        @Override
        public void setBeverage() {
            System.out.println("콜라를 줍니다");
        }
    }
     
    cs

          

           ▶ main과 결과 화면

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class TestBurger {
        public static void main(String[] args) {
            Burger[] burger = {new CheezeBurger(), new ChikenBurger()};
            
            for(int i=0; i<burger.length; i++) {
                if(burger[i] instanceof CheezeBurger) {
                    ((CheezeBurger)burger[i]).setCheeze();
                }
                burger[i].prepareBurger();
                System.out.println("-------------------------------");
            }
        }
    }
     
    cs

          




    ※ 정리

        CheezeBurger 와 ChickenBurger는 조금의 차이는 있지만 만드는 방법은 사실상 똑같기 때문에 만드는 방법을 부모클래스에 일반화 시킵니다.

        일반화시킨 Buger 클래스 안의 prepareBurger() 메소드는 템플릿 메소드입니다. 이 메소드는 햄버거를 만드는 알고리즘에 대한 템플릿 역할을 합니다. 

        템플릿 내에서 알고리즘의 각 단계는 메소드로 표현되구요, 각 메소드는 부모 클래스 혹은 자식클래스(abstract로 선언된 메서드)에서 처리됩니다. 





    ** 템플릿 메소드 패턴의 장점

      1) 부모클래스에서 작업을 처리하고 하나의 알고리즘을 가지고 있으며, 보완 및 수정이 쉽습니다.

      2) 자식클래스에서 코드를 재사용할 수 있습니다.

      3) 다른 자식클래스를 만들 때 쉽게 만들 수 있는 프레임워크를 제공하고 몇가지 메소드만 추가하면 됩니다.

              



    반응형

    'DesignPattern' 카테고리의 다른 글

    2. 싱글톤 패턴(Singleton Pattern)  (0) 2018.07.23
Designed by Tistory.