본문 바로가기
아키텍처/디자인 패턴

3. Template Method Pattern

by doflamingo 2020. 12. 13.

템플릿 메소드 패턴은 구현하려는 알고리즘이 일정한 프로세스가 존재할 때 사용한다.

그리고 알고리즘이 변경 가능성이 있을 때 사용하기 좋다. 

 

템플릿 메소드 패턴은 일반화해서 만들 수 있다. 

  1. 알고리즘을 여러 단계로 나눈다. 

  2. 나눠진 알고리즘의 단계를 추상 메소드로 선언한다.

  3. 알고리즘을 수행할 템플릿 메소드로 만든다. 

  4. 하위 클래스에서 나눠진 메소드를 구현한다. 

 

아키텍처를 보면 더 쉽게 알 수 있다. 

 

template method pattern 아키텍처

 

코드의 예제를 통해서 실제 어떻게 구현되는 지 알아보자. 

 

접속 기능을 만들건데 접속은 아래 4개의 과정이 포함된다.

  • 보안 과정 (doSecurity)
  • 인증 과정 (authorization)
  • 인가 과정 (authentication)
  • 접속 과정 (connection)

이렇게 프로세스가 있는 경우 템플릿 메소드 패턴으로 만들기 좋다. 

 

public abstract class AbstGameConnectHelper {

   protected abstract String doSecurity(String string);
   protected abstract boolean authentication(String id, String password);
   protected abstract int authorization(String userName);
   protected abstract String connection(String info);

   public String requestConnection(String encoded) throws Exception {

      //보안 작업 -> 암호화 된 문자열을 복호화
      String decodedInfo = doSecurity(encoded);

      //decode된 정보로 id, password 가져왔다고 가정
      String id = "aaa";
      String password = "bbb";
      if(!authentication(id, password)) {
         throw new Exception("인증 실패");
      }
      //decode된 정보로 userName 가져왔다고 가정
      String userName = "aaa";
      int level = authorization(userName);
      //레벨별 로직 설정
      switch (level) {
         case 0:
            break;
         case 1:
            break;
         case 2:
            break;
         case 3:
            break;
         default:
            break;
      }
      return connection(decodedInfo);
   }
}

각각 프로세스의 스텝은 추상 메소드로 만들어준다.

여기서 주의할 점은 각각의 스텝은 외부에서는 접근을 못하고 상속받은 클래스에서만 사용할 수 있도록 protected로 설정해주는 것이 좋다.

그리고 그 스텝을 이용해서 총 프로세스는 템플릿 메소드를 통해서 추상 클래스에서 미리 만들어준다. 

public class DefaultGameConnectionHelper extends AbstGameConnectHelper{
  @Override
  protected String doSecurity(String string) {
    System.out.println("복호화");
    return string;
  }

  @Override
  protected boolean authentication(String id, String password) {
    System.out.println("아이디 암호 확인과정");
    return true;
  }

  @Override
  protected int authorization(String userName) {
    System.out.println("권한 확인");
    return 0;
  }

  @Override
  protected String connection(String info) {
    System.out.println("마지막 접속 단계");
    return info;
  }
}

각각의 메소드는 추상 클래스를 상속 받아서 구현해준다.

 

public class Main {
  public static void main(String[] args) throws Exception {
    AbstGameConnectHelper helper = new DefaultGameConnectionHelper();
    helper.requestConnection("접속 정보");
  }
}

템플릿 메소드만 불러주면 내부 로직은 신경쓰지 않고도 사용할 수 있게된다. 

그리고 만약 내부 스텝이 변경되어도 전체 프로세스는 건드리지 않고 수정할 수 있게 확장성도 좋아진다.

 

결과화면

 

코드

 

- 출처 -

youtu.be/qr7I18Lhsl8

www.codinginsights.blog/design-patterns-template-method/

'아키텍처 > 디자인 패턴' 카테고리의 다른 글

5. Singleton Pattern  (0) 2020.12.13
4. Factory Method Pattern  (0) 2020.12.13
2. Adapter Pattern  (2) 2020.12.10
1. Strategy Pattern  (0) 2020.12.09

댓글