TemplateMethod pattern

This commit is contained in:
kim
2021-01-08 18:44:44 +09:00
parent 18e8ebcf3c
commit 9a3ccd73eb
4 changed files with 122 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
package TemplateMethod;
import TemplateMethod.connection.AbstGameConnectHelper;
import TemplateMethod.connection.DefaultGameConnectHelper;
public class Main {
public static void main(String[] args) {
AbstGameConnectHelper helper = new DefaultGameConnectHelper();
helper.requestConnection("아이디 암호 등 접속 정보");
}
}

View File

@@ -0,0 +1,32 @@
Template Method
- 공통적인 프로세스 묶어주기
- 알고리즘의 구조를 메소드에 정의하고 하위 클래스에서 알고리즘 구조의
변경없이 알고리즘을 재정의 하는 패턴
When?
- 구현하려는 알고리즘이 일정한 프로세스가 있다.
- 구현하려는 알고리즘이 변경 가능성이 있다.
How?
- 알고리즘을 여러 단계로 나눈다.
- 나눠진 알고리즘의 단계를 메소드로 선언한다.
- 알고리즘을 수행할 템플릿 메소드를 만든다.
- 하위 클래스에서 나눠진 메소드들을 구현한다.
요구사항
- 게임의 접속을 구현
- requestConnection(String str) : String
- 유저가 게임 접속시 다음을 고려
- 보안 과정 : 보안 관련 부분을 처리합니다.
- doSecurity(String string) : String
- 인증 과정 : username 과 password 가 일치하는지 확인합니다.
- authentication(String id, String password) : boolean
- 권한 과정 : 접속자가 유료 회원인지 무료회원인지 게임 마스터인지 확인합니다.
- authorization(String userName) : int
- 접속 과정 : 접속자에게 커넥션을 정보를 넘겨 줍니다.
- connection(String info) : String
추가사항이 생긴다면
- 강화된 방식으로 코드 변경
- 밤 10시 이후 접속 제한
-> 구현부를 수정하면 된다.

View File

@@ -0,0 +1,47 @@
package TemplateMethod.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 encodedInfo) {
// 보안 작업 -> 암호화 된 문자열을 복호화
String decodedInfo = doSecurity(encodedInfo);
// 반환된 것을 가지고 아이디, 암호를 할당한다.
String id = "abc";
String password = "1234";
if(!authentication(id, password)) {
throw new Error("아이디 암호 불일치");
}
String userName = "userName";
int authorization = authorization(userName);
switch (authorization) {
case -1:
throw new Error("셧다운");
case 0: // 게임 메니저
System.out.println("게임 매니저");
break;
case 1: // 유료회원
System.out.println("유료회원");
break;
case 2: // 무료회원
System.out.println("무료회원");
break;
case 3: // 권한없음
System.out.println("권한없음");
break;
default: // 기타
System.out.println("기타");
break;
}
return connection(decodedInfo);
}
}

View File

@@ -0,0 +1,30 @@
package TemplateMethod.connection;
public class DefaultGameConnectHelper extends AbstGameConnectHelper{
@Override
protected String doSecurity(String string) {
// System.out.println("decode");
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("권한 확인");
// 서버에서 유저이름으로 유저의 나이를 확인 후 시간 확인
// 성인이 아니고 10시가 지났다면 권한이 없는 것으로 판단하는 알고리즘을 구현
return 0;
}
@Override
protected String connection(String info) {
System.out.println("마지막 접속 단계");
return info;
}
}