Java/Design Pattern
[디자인 패턴] Template Method Pattren(템플릿 메소드 패턴)
hyerann
2020. 7. 19. 14:02
템플릿 메소드 패턴(Template Method Pattren)
공통적인 프로세스를 묶어 주기
학습 목표
일정한 프로세스를 가진 요구사항을 템플릿 메소드 패턴을 이용하여 구현할 수 있다.
알고리즘의 구조를 메소드에 정의하고 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의하는 패턴
- 수정할 때는 구현 클래스만 수정
- 효과적인 유지 보수 가능
기본 설계
어떨 때 사용하는 가
- 구현하려는 알고리즘이 일정한 프로세스가 있다.
- 여러 단계로 나눌 수 있다.
- 구현하려는 알고리즘이 변경 가능성이 있다.
사용하는 단계
- 알고리즘을 여러 단계로 나눈다.
- 나눠진 알고리즘의 단계를 메소드로 선언한다.
- 알고리즘을 수행할 템플릿 메소드를 만든다.
- 하위 클래스에서 나눠진 메소드들을 구현한다.
예제
요구 사항
- 신작 게임의 접속을 구현해주세요.
- requestConnection(String str): String
- 유저가 게임 접속 시 다음을 고려해야 합니다.
- 보안 과정: 보안 관련 부분을 처리합니다.
- doSecurity(String string): String
- 인증 과정: user name과 password가 일치하는지 확인합니다.
- authentication(String id, String password): boolean
- 권한 과정: 접속자가 유료 회원인지 무료 회원인지 게임 마스터인지 확인합니다.
- authorization(String userName): int
- 접속 과정: 접속자에게 커넥션을 정보로 넘겨줍니다.
- connection(String info): String
- 보안 과정: 보안 관련 부분을 처리합니다.
AbstGameConnectHelper.java
public abstract class AbstGameConnectHelper {
//외부에서 호출하면 안되는데 하위 클래스에서 사용할 수 있게 해야 함 -> protected
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 encodedInfo) {
//보안 작업 -> 암호화된 문자열을 복호화
String decodedInfo = doSecurity(encodedInfo);
//반환된 것을 가지고 아이디, 암호를 할당한다.
String id = "aaa";
String password = "bbb";
if (!authentication(id, password)) {
throw new Error("아이디 암호 불일치");
}
String userName = "userName";
int i = authorization(userName);
switch (i) {
case -1:
throw new Error("셧 다운");
case 0: //게임 매니저
break;
case 1: //유료 회원
break;
case 2: //무료 회원
break;
case 3: //권한 없음
break;
default: //기타 상황
break;
}
return connection(decodedInfo);
}
}
DefaultGameConnection.java
public class DefaultGameConnection extends AbstGameConnectHelper {
@Override
protected String doSecurity(String string) {
System.out.println("디코드");
return null;
}
@Override
protected boolean authentication(String id, String password) {
System.out.println("아이디/암호 확인 과정");
return true;
}
@Override
protected int authorization(String userName) {
System.out.println("권한 확인");
//서버에서 유저 이름, 유저의 나이를 알 수 있다.
//나이와 시간을 확인하여 성인이 아니고 10시가 지났다면 권한이 없는 것으로 한다.
return 0;
}
@Override
protected String connection(String info) {
System.out.println("마지막 접속 단계");
return info;
}
}
Main.java
public class Main {
public static void main(String[] args) {
AbstGameConnectHelper helper = new DefaultGameConnection();
helper.requestConnection("아이디 암호 등 접속 정보");
// <결과>
//디코드
//아이디/암호 확인 과정
//권한 확인
//마지막 접속 단계
}
}
www.inflearn.com/course/자바-디자인-패턴/dashboard