You will be fine

<디자인패턴입문> 3. Template Method 패턴

by BFine
반응형

 

www.yes24.com/Product/Goods/2918928

 

Java 언어로 배우는 디자인 패턴 입문

이 책은 디자인 패턴의 입문서입니다. GoF가 정리한 23개의 디자인 패턴을 하나씩 다루면서 객체 지향을 잘 모르는 초보자도 이해하기 쉽도록 정리하고 있습니다. 단순한 이론이나 논리을 제시하

www.yes24.com

 

가. 무엇일까?

 a. 이미 만들어진 틀

  -  문구적인 예를 들면 템플릿은 문자 모양으로 구멍이 뚫려있는 얇은 플라스틱 판으로 문자를 따라 쓰는 것이 있다.

       => 펜으로 쓰면 펜으로 쓴 문자, 연필로 쓰면 연필로 쓴 문자 등 도구상관 없이 결과물은 같다. 

 

 b. 템플릿 메서드 패턴

  -  구성

        1.  상위 클래스쪽에 템플릿에 해당하는 메서드가 정의

        2.  메서드 안에 추상 메서드가 사용

        3.  추상메서드 구현은 하위 클래스! 

  -  서로 다른 하위클래스가 있다면 서로 다른 처리가 실행되지만 큰흐름은 상위 클래스에서 결정한대로 이루어짐

  -  즉 상위 클래스에서 뼈대를 결정하고 하위클래스에서 구체적인 내용을 결정하는 디자인 패턴

 

나. 만들어본 예제

 a.  Abstract Class 역할

  -  AnimalDisplay는 추상클래스로 선언이고 display 메서드만 구현하고 있다.

  -  display 메서드에서 큰 흐름 쥐고 있는게 보인다. 

  -  이 클래스가 템플릿 메서드를 구현하고 있는 것을 알 수 있다. 

public abstract class AnimalDisplay {
    public abstract void before();
    public abstract void content();
    public abstract void after();

    public final void display(){
        before();
        for (int i = 0; i < 3; i++) {
            content();
        }
        after();
    }
}

 

 b.  Concreate Class 역할

  -  CatPlayDogPlayAnimalDisplay를 상속받아 before, content, after를 구현하는 하위 클래스 이다.

  -  틀은 같지만 각자 다른 작업을 가지고 있는 것을 볼 수 있다.

  -  Abstract Class의 추상메서드를 구체적으로 구현하며 역으로 Abstract Class에서 호출해 사용된다.

public class CatPlay extends AnimalDisplay{
    private String name;

    public CatPlay(String name) {
        this.name = name;
    }

    @Override
    public void before() {
        System.out.println("---- 고양이 "+name+"에게 간식을 주는 중입니다. -----");
    }

    @Override
    public void content() {
        System.out.println("야옹~");
    }

    @Override
    public void after() {
        System.out.println("---- 고양이 "+name+"은 배가 부릅니다. -----");
    }
}

public class DogPlay extends AnimalDisplay{
    private String name;

    public DogPlay(String name) {
        this.name = name;
    }

    @Override
    public void before() {
        System.out.println("---- 강아지 "+name+"와 산책중입니다 -----");
    }

    @Override
    public void content() {
        System.out.println("멍멍~");
    }

    @Override
    public void after() {
        System.out.println("---- 강아지 "+name+"와 산책이 끝났습니다. -----");
    }
}

 

 c. Main

  -  구현체를 다르게 사용되었지만 실제 호출은 AnimalDisplaydisplay가 호출된 것을 알 수 있다.

 public static void main(String[] args) {

        AnimalDisplay dog = new DogPlay("코니");
        AnimalDisplay cat = new CatPlay("저스틴");
        dog.display();
        cat.display();
  }
 
출력:
 ---- 강아지 코니와 산책중입니다 -----
멍멍~
멍멍~
멍멍~
---- 강아지 코니와 산책이 끝났습니다. -----
---- 고양이 저스틴에게 간식을 주는 중입니다. -----
야옹~
야옹~
야옹~
---- 고양이 저스틴은 배가 부릅니다. -----

 

다. 특징

 a. 장점

    1. 로직을 공통화 할 수 있다.

    2. 하위 클래스를 상위 클래스와 동일시 한다.

        => instanceof 등으로 하위 클래스의 종류를 특정하지 않고 로직 구현이 가능

 

 b. 이 패턴에 생각

  -  회사에 코드를 살펴보다보면 템플릿 메서드 패턴을 적용한 부분들이 좀 있는 것 같다. 흠 내생각에는

     조금 불필요한 패턴이 아닌가라는 생각이 들기도 한다. 굳이 틀을 만들어서 할 필요가 있을까?

     instanceof 의 경우 차라리 인터페이스로 만들어서 처리해도 문제 없을 것 같고 하나의 클래스안에서
     로직의 흐름이 보이는게 더 좋지 않을까? 라는 생각이 딱 템플릿 패턴만 놓고 봤을때 느낌이다.

  -  여기 의의에도 나와있는데 예전부터 추상클래스가 필요한가? 라는 의문의 있었는데 이 패턴을 통해

      어떻게 사용할때 좋을지 알게된 것 같다. 

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기