Template Method Pattern
알고리즘 구조를 메소드에 정의 후 하위 클래스에서 알고리즘 구조의 변경 없이 알고리즘을 재정의 하는 패턴입니다.
즉 구현하려는 알고리즘이 프로세스가 있고, 변경 가능성이 있을 때 사용합니다.
방법
- 알고리즘을 여러 단계로 나눈다.
- 나눠진 알고리즘의 단계를 메소드로 선언
- 알고리즘을 수행할 템플릿 메소드를 생성
- 하위 클래스에서 메소드 구현
요구사항
- 신작 게임의 접속을 구현
- requestConnection(String str):String
- 유저가 게임 접속 시 다음 고려
- 보안 과정: 보안 관련 처리
- doSecurity(String string):String
- 인증 과정: userName과 password 일치
- authentication(String id, String password): boolean
- 권한 과정: 접속자가 유료, 무료, 게임 메니저 인지 확인
- authorization(String userName):int
- 접속 과정: 접속자에게 커넥션 정보를 넘긴다.
- connection(String info):String
- 보안 과정: 보안 관련 처리
- 변경 사항: 나이대를 고려하여 셧다운제를 실행해라.
우선 추상클래스를 만들어주자 이름은 GameConnectionHelper.java 패키지는 com.jeongchan.templete.abst
GameConnectionHelper.java
package com.jeongchan.templete.abst;
public abstract class GameConnectHelper {
//노출이 안되기때문에 하위클래스에서만 사용가능하도록 proteced 선언
//보안 과정: 보안 관련 부분을 처리
protected abstract String doSecurity(String string);
//인증 과정: userName과 password가 일치하는지 확인
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 = "";
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:
break;
}
return connection(decodedInfo);
}
}
이제 추상내 템플릿 메소드를 메인에서 구현해준다. 이전에 추상 클래스를 구현부를 만들어주자.
이름은 DefaultGameConnectionHelper.java 패키지는 com.jeongchan.templete.abst
DefaultGameConnectionHelper.java
package com.jeongchan.templete.abst;
public class DefaultGameConnectionHelper extends GameConnectHelper{
@Override
protected String doSecurity(String string) {
System.out.println("디코드 작업");
//string을 디코드 하여 반환
//수정!!
System.out.println("강화된 알고리즘 디코딩 작업");
return string;
}
@Override
protected boolean authentication(String id, String password) {
// TODO Auto-generated method stub
System.out.println("아이디/암호 확인 과정");
//확인 후 맞으면 true 틀리면 false boolean 변수로 작업 여기서는 그냥 무조건 맞다고 true로 처리
return true;
}
@Override
protected int authorization(String userName) {
// TODO Auto-generated method stub
System.out.println("권한 확인");
//수정: 서버에서 유저 나이를 가져오고
//나이 확인 후 성인이 아니고 10시가 지났다면
//권한이 없는 것으로 넘겨준다.
return 0;
}
@Override
protected String connection(String info) {
// TODO Auto-generated method stub
System.out.println("마지막 접속 단게!");
return info;
}
}
이제 메인부에서 구현하자. 패키지는 com.jeongchan.templete
Main.java
package com.jeongchan.templete;
import com.jeongchan.templete.abst.DefaultGameConnectionHelper;
import com.jeongchan.templete.abst.GameConnectHelper;
public class Main {
public static void main(String[] args) {
GameConnectHelper helper = new DefaultGameConnectionHelper();
helper.requestConnection("아이디 암호 등 접속 정보");
}
}
결과
디코드 작업
강화된 알고리즘 디코딩 작업
아이디/암호 확인 과정
권한 확인
게임 메니저
마지막 접속 단게!
'프로그래밍 언어 > Java' 카테고리의 다른 글
디자인패턴-팩토리메소드 (0) | 2019.08.23 |
---|---|
디자인패턴- Adapter (0) | 2019.08.21 |
자바 공부(취업 준비) (0) | 2019.07.29 |
Java - 람다 (0) | 2019.07.28 |
Java- 열거형 (0) | 2019.07.26 |