템플릿 메소드 패턴

반응형
반응형

짤같은

오랜만에 디자인 패턴을 공부하는 것 같다.
이 패턴에 대해 간략하게 설명하자면, 공통 부분을 미리 만들어 놓고 
그것을 가져다 쓰는 방식이다.

이 패턴은 상속을 통해 이뤄진다. 상속?
상속을 사용한다는 뜻은 부모와 자식의 관계가 명확하다는 이야기다.

즉, 부모쪽에 공통 부분을 뽑아 내고 자식 쪽에서 그것을 오버라이딩 하는 것이다.

예제를 고민해봤는데 생각보다 쉽지 않을 것 같다. 간단하게 숫자를 계산하는 계산기를 만들어 보려구 한다.

시작

  public int calculate() {
    return get(1, 2, 3, 4);
  }

  private int get(int... numbers) {
    int result = 1;
    for (int number : numbers) {
      result *= number;
    }
    return result;
  }

코드를 확인하는 순간 덧셈을 추가해야 된다는 요구사항이 생겼다고 가정해봅시다.
그러면 이것을 복사해서 또다른 클래스로 만드는것도 하나의 방법입니다.

그런데 공통인 부분이 떡하니 보이는데 이것을 그대로 복사 붙여넣기 하는건 메모리 낭비입니다.
어떻게 하면 이것을 해결할 수 있을 까요?

이럴때 사용되는 것이 템플릿 메소드 패턴입니다. 
일단 get메소드 부분을 수정해봅시다.

protected abstract int get(int... numbers);

요 부분을 구현할 수 있게 abstract 메소드로 만들구 이 클래스를 상속을 시키면 끝입니다.

@Override
  protected int get(int... numbers) {
    int result = 0;
    for (int number : numbers) {
      result += number;
    }
    return result;
  }

요걸 이렇게 오버라이딩 해서 사용하면 끝입니다.
이제 요 부분만 가져다 쓰면 되는데... 저 반복문이 조금 걸리긴 합니다. 저기도 공통으로 빼도 될것 같은데
뭐 지금 저거 까지 할 필요는 없을 것 같네요.

템플릿 메서드 콜백 패턴

이 패턴은 쉽게 말해서 상속을 사용하지 말구 조합을 사용하라는 겁니다.
그냥 요렇게 만들면 끝입니다.

public interface Operation {
  int get(int... numbers);
}
  public int calculate(Operation operation) {
    return operation.get(1, 2, 3, 4);
  }

요렇게 만들면 준비과정은 끝입니다.

이것을 사용해봅시다.

new 클래스.calculate(numbers -> {
      int result = 1;
      for (int number : numbers) {
        result *= number;
      }
      return result;
    });

이게 콜백 패턴입니다.
이제 상속을 사용하지 않고 조합만으로도 같은 결과를 도출할 수 있다는 점에서 좋다는 생각이 듭니다.

 

반응형

'디자인패턴' 카테고리의 다른 글

퍼사드 패턴  (0) 2021.12.05
브릿지 패턴  (0) 2021.11.25
전략 패턴  (0) 2021.11.19
팩토리 메소드 패턴 vs 추상 팩토리 패턴  (0) 2021.11.11
싱글톤 패턴  (0) 2021.11.03

댓글

Designed by JB FACTORY