출처
이야기's G님 유튜브
알고리즘의 구조를 메소드에 정의하고 하위 클래스에서 알고리즘 구조의
변경없이 알고리즘을 재정의하는 패턴
구현하려는 알고리즘이 일정한 프로세스가 있다.
구현하려는 알고리즘이 변경 가능성이 있다.
알고리즘을 여러 단계로 나눈다.
나눠진 알고리즘의 단계를 메소드로 선언한다.
알고리즘을 수행할 템플릿 메소드를 만든다.
하위 클래스에서 나눠진 메소드들을 구현한다.
신작 게임의 접속을 구현해주세요
유저가 게임 접속시 다음을 고려해야합니다.
보안 과정 : 보안 관련 부분을 처리합니다
인증 과정 : user name과 password가 일치하는지 확인합니다
권한 과정 : 접속자가 유로 회원인지 무료회원인지 게임 마스터 인지 확인합니다.
접속 과정 : 접속자에게 커넥션 정보를 넘겨줍니다
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 decodeInfo = 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://게임 매니저
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(decodeInfo);
}
}
public class DefaultGameConnectHelper 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("권한 확인");
//서버에서 유저이름 유저의 나이를 알 수 있음.
//나이를 확인하고 시간을 확인하고 성인이 아니고 10시가 지났다면
//권한이 없는 것으로 한다
return 0;
}
@Override
protected String connection(String info) {
System.out.println("마지막 접속단계!");
return info;
}
}
public class Main {
public static void main(String[] args) {
AbstGameConnectHelper helper = new DefaultGameConnectHelper();
helper.requestConnection("아이디 암호 등 접속 정보");
}
}