공부/Java

TemplateMethod Pattern | Strategy Pattern

kkkkkdddddhhhhh 2024. 1. 6. 18:22

프로그램 코드를 작성하며 비슷한 규격의 코드가 반복 될 때,

프로그램의 핵심 기능과 부가 기능을 나누고 싶을 때

 

TemplateMethod Pattern을 사용한다.

 

학습 테스트를 통해 알아보자.

 

 

위 메서드의 대해 간단하게 훑어보자면

비지니스 로직을 실행하는 핵심기능과

메서드의 시작시간과 종료시간을 구해 메서드 실행시간을 구하는 부가기능이 공존하는 메서드다.

 

비지니스 로직을 수행하는 핵심기능은 각 logic별로 다르지만

 

시작시간과 종료시간을 구해 실행시간을 구하는 부가 기능은 logic1과 logic2 모두 같다.

 

이러한 비슷 규격의 코드를 템플릿화 시켜 변경되는 부분만 템플릿에 맞춰 사용하는 패턴이 템플릿메서드 패턴이다.

 

학습테스트에 적용해보자

 

 

Abstract Class에 골격이되는 템플릿메서드를 작성한다. ( 반복되었던 시작시간과 종료시간을 구해 실행시간을 구하던 코드 )

템플릿메서드 중간에 변경이되는 부분을

abstract method를 생성해 템플릿의 변경되는 메서드를 상속해주자. 

 

상속받은 클래스를 직접 생성 할 수 있지만, 간단하게 사용하기위해 익명 내부클래스로 추상 클래스를 구현했다.

 

템플릿메서드 패턴을 구현하기 전과 비교할때, 

기존의 실행시간을 구하던 코드는 규격화되었고, 

비지니스 로직을 구하는 핵심 기능만 변경해 사용 할 수 있는 템플릿이 완성되었다.

 

부모클래스에 템플릿을 정의하고 변경로직을 자식 클래스에 정의하는것. 

으로 이해했다.

 

템플릿메서드 패턴은 다만 상속의 단점을 모두 안고간다.

자식클래스가 부모클래스를 상속한다는것은 자식이 부모를 의존하고있다는 의미다.

 

부모클래스에서 조금이라도 변경이 생긴다면 수많은 자식클래스 또한 영향을 받는다는 의미

 

이러한 TemplateMethod Pattern의 상속 단점을 개선한 Strategy Pattern이 있다.

 


Strategy Pattern

템플릿 메서드 패턴의 상속으로인한 단점을 개선한 패턴

차이점으로 템플릿(골격)이 되는 메서드는 Context에 작성을하고, 템플릿에서 변경되는 부분은 추상 클래스의 추상 메서드가 아닌 Interface에 작성을 한다.

 

Interface를 활용해 상속이 아닌 구현으로 Context Class에 원하는 Strategy를 끼워 맞춰 조립 할 수 있다. 

또한 Context와 Strategy는 서로 상속을 주고받지 않는 별개의 Class로 상속으로인한 의존관계의 단점이 없다.

 

학습테스트로 직접 코드를 살펴봤다.

변경되는 부분이 들어가는 인터페이스 

다양한 Strategy를 구현해 템플릿에 끼워 조립 할 수 있다.

 

템플릿메서드를 작성하는 Context Class 역시 살펴보자.

필드, 파라미터로 strategy를 관리하는 방법이 나뉜다.

템플릿을 작성하는 Context Class에는 Strategy를 관리하는 두가지 방법이 존재한다.

  1. 필드에 Strategy를 보관하는방식
    • 이 방식은 Context 객체가 생성될 때 Strategy를 생성자 변수로 받아 객체가 생성 된 후 템플릿 메서드를 실행한다.
      • 장점: 객체를 생성할 때 Strategy를 필요함으로 객체 생성 후 간편하게 템플릿 메서드를 반복하여 사용 할 수 있다.
      • 단점: Setter를 사용하지 않는 한 객체 생성 후 Strategy 변경에 어려움이 있다.
  2. 파라미터로 Strategy를 관리하는 방식
    • 이 방식은 Context 객체 생성 후 Strategy 를 템플릿 메서드 매개변수로 받아 관리한다.
      • 장점: 템플릿 메서드를 사용할 때 Strategy를 받으므로 Srategy 변경에 용이하다.
      • 단점: 템플릿 메서드를 사용할 때마다 계속 변수로 Strategy를 필요로한다.

템플릿의 Strategy의 변경이 잦다면 파라미터방식을,

변경이 잦지않다면 필드관리 방식을 사용하자.

 

 

골격이 되는 Context 객체를 생성 후 

 

파라미터를 받아 Context.execute()에 Strategy를 구현해 사용했다.

 

최근 자바 코드의 방향성이 상속을 받는 Class를 줄이자 인것을 보아 템플릿 메서드 패턴보다는

전략(Strategy)패턴을 사용해 반복되는 코드의 양을 줄이고 핵심 기능과 부가기능의 경계를 나눠보자.

'공부 > Java' 카테고리의 다른 글

Decorator Pattern  (0) 2024.01.09
Proxy Pattern  (0) 2024.01.08
동시성 문제와 TreadLocal  (0) 2024.01.04