자바 디자인패턴

[Java Design Pattern] 자바 디자인패턴, 템플릿 메소드 패턴

코딩하는흑구 2019. 9. 5. 15:23
템플릿 메소드 패턴

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

- 구현하려는 기능이 일정한 프로세스가 존재한다.

- 구현하려는 기능이 사용하는 알고리즘이 추후 변경가능성이 있다.

 

템플릿 메소드 패턴을 위한 단계

1. 구현하려는 기능의 필요한 여러가지 단계를 확인.

2. 각각의 단계를 메소드로 분리 선언

3. 수행할 템플릿 메소드를 생성.

4. 하위 클래스에서 구현.

 

예제로 확인

추상 클래스 선언!

public abstract class AbstGameConnectHelper {
	
	//외부에 노출되면 안됨.
	
	//보안과정
	protected abstract String doSecurity(String string);
	
	//인증과정
	protected abstract boolean authenication(String id, String password);
	
	//권한 과정
	protected abstract int authorization(String userName);
	
	//접속과정
	protected abstract String connection(String info);
	
	
	//템플릿 메소드
	public String requestConnection(String endcodedInfo) {//암호화된 string
		
		//보안 작업. -> 암호화된 문자열을 복호화(디코드)
		String decodedInfo = doSecurity(endcodedInfo);
		//반환된 것을 가지고 아이디, 암호를 할당한다.
		String id ="aaa";
		String password = "bbb";
		
		//인증 과정 -> id와 password가 맞냐 
		if(!authenication(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:	//무료회원
			break;
		case 3:	//권한없음
			break;
		default://기타상황
			break;
		}
		
		return connection(decodedInfo);
	}
}

- 추상클래스에서 추상메소드를 템플릿 메소드에서 활용.

- 템플릿 메소드는 각각의 추상메소드에 해당하는 단계를 가짐.

 

구현 클래스

public class DefaultGameConnectionHelper extends AbstGameConnectHelper {

	@Override
	protected String doSecurity(String string) {
		System.out.println("강화된 알고리즘을 이용한 디코드");
		return string;
	}

	@Override
	protected boolean authenication(String id, String password) {
		System.out.println("아이디 / 비밀번호 확인 과정");
		return true;
	}

	@Override
	protected int authorization(String userName) {
		System.out.println("권환 확인");
		//무조건 관리자..
		//원래 알고리즘 들어가야함.
		
		// 추가사항 10시 이후 성인 아니면 접속 안되게
		//서버에서 유저이름을 가지고 유저의 나이를 알 수 있는데
		//나이를 확인하고 시간을 확인해서 성인이 아니고 10시가 지났다면.
		//권한이 없는 것으로 한다.
		
		return 0;
	}

	@Override
	protected String connection(String info) {
		System.out.println("마지막 접속단계!");
		return info;
	}
}

- 구현 클래스는 추상클래스에 있는 각각의 추상메소드들을(알고리즘 단계) 구현한다. 예제에서는 간단하게 구현하였다.

- 템플릿 메소드는 건들지 않는다. 왜냐하면 템플릿 메소드는 각각의 메소드들을 활용해서 진행하기 때문이다.

- Default클래스에 정의된 메소드만 수정하여 처리하도록 설계해야한다.

 

메인스레드

import TemplateMethodPattern.lib.AbstGameConnectHelper;
import TemplateMethodPattern.lib.DefaultGameConnectionHelper;

public class Main {
	public static void main(String[] args) {
		AbstGameConnectHelper helper = new DefaultGameConnectionHelper();
		helper.requestConnection("아이디 암호 등 접속 정보");
		
	}
}