템플릿 메소드 패턴은 구현하려는 알고리즘이 일정한 프로세스가 존재할 때 사용한다.
그리고 알고리즘이 변경 가능성이 있을 때 사용하기 좋다.
템플릿 메소드 패턴은 일반화해서 만들 수 있다.
1. 알고리즘을 여러 단계로 나눈다.
2. 나눠진 알고리즘의 단계를 추상 메소드로 선언한다.
3. 알고리즘을 수행할 템플릿 메소드로 만든다.
4. 하위 클래스에서 나눠진 메소드를 구현한다.
아키텍처를 보면 더 쉽게 알 수 있다.
코드의 예제를 통해서 실제 어떻게 구현되는 지 알아보자.
접속 기능을 만들건데 접속은 아래 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("접속 정보");
}
}
템플릿 메소드만 불러주면 내부 로직은 신경쓰지 않고도 사용할 수 있게된다.
그리고 만약 내부 스텝이 변경되어도 전체 프로세스는 건드리지 않고 수정할 수 있게 확장성도 좋아진다.
- 출처 -
'아키텍처 > 디자인 패턴' 카테고리의 다른 글
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 |
댓글