본문으로 바로가기

디자인 패턴- Template Method Pattern

category 프로그래밍 언어/Java 2019. 8. 21. 16:27

Template Method Pattern

알고리즘 구조를 메소드에 정의 후 하위 클래스에서 알고리즘 구조의 변경 없이 알고리즘을 재정의 하는 패턴입니다.

 

즉 구현하려는 알고리즘이 프로세스가 있고, 변경 가능성이 있을 때 사용합니다.

 

방법

  • 알고리즘을 여러 단계로 나눈다.
  • 나눠진 알고리즘의 단계를 메소드로 선언
  • 알고리즘을 수행할 템플릿 메소드를 생성
  • 하위 클래스에서 메소드 구현

요구사항

  1. 신작 게임의 접속을 구현
    1. requestConnection(String str):String
  2. 유저가 게임 접속 시 다음 고려
    1. 보안 과정: 보안 관련 처리
      1. doSecurity(String string):String
    2. 인증 과정: userName과 password 일치
      1. authentication(String id, String password): boolean
    3. 권한 과정: 접속자가 유료, 무료, 게임 메니저 인지 확인
      1. authorization(String userName):int
    4. 접속 과정: 접속자에게 커넥션 정보를 넘긴다.
      1. connection(String info):String
  3. 변경 사항: 나이대를 고려하여 셧다운제를 실행해라.

우선 추상클래스를 만들어주자 이름은 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