[디자인 패턴] Template Method 패턴

이멀젼씨

·

2020. 1. 19. 18:07

- 정의

 

상위 클래스에서 처리 흐름을 제어하고, 하위 클래스에서는 상위 클래스의 처리 흐름(각각의 기능)에 해당하는 메소드를 재정의 하는 패턴이다

 

- UML

1. GameConnectHelper클래스에 연결을 요청하는 requestConnection메소드와 보안담당 doSecurity, 인증담당 authentication, 권한담당 authorization, 연결담당 connection메소드를 정의한다. requestConnection은 나머지 메소드를 한꺼번에 실행하여 일련의 로그인 과정을 처리해주는 메소드이다. 나머지 메소드들은 재정의가 가능한 메소드이다

2. DefaultGameConnectHelper클래스는 GameConnectHelper클래스를 상속받아 보안담당 doSecurity, 인증담당 authentication, 권한담당 authorization, 연결담당 connection메소드를 재정의 하였다

3. Main클래스에서 인증을 실행한다

 

- 코드

 

GameConnectHelper class

public abstract class GameConnectHelper {
	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) {
		
		// 보안(decoding)
		String decodedInfo = doSecurity(encodedInfo);
		
		// 반환된 것을 갖고 아이디와 암호 할당
		String id = "aaa";
		String password = "bbb";
		
		// 인증
		if(authentication(id, password)) {
			throw new Error("id & pw not matched");
		}
		
		String userName = "userName";
		int i = authorization(userName);
		switch(i) {
		case -1:
			throw new Error("Shut Down");
		case 0: // Game Manager
			System.out.println("Game Manager");
			break;
		case 1: // Paid Member
			System.out.println("Paid Member");
			break;
		case 2: // Free Member
			System.out.println("Free Member");
			break;
		case 3: // No Permission
			System.out.println("No permission");
			break;
		default: // Etc
			break;
		}
		
		return connection(decodedInfo);
	}
}

DefaultGameConnectHelper class

public class DefaultGameConnectHelper extends GameConnectHelper{

	@Override
	protected String doSecurity(String string) {
		
		// Before
		// System.out.println("Decoding");
		// After
		System.out.println("Enhanced decoding");
		return string;
	}

	@Override
	protected boolean authentication(String id, String password) {
		System.out.println("Check id & pw");
		return false;
	}

	@Override
	protected int authorization(String userName) {
		System.out.println("Check authorization");
		// 유저이름을 통해 유저의 나이를 알 수 있음
		// 성인이 아니고 10시가 지났다면
		int age = 20;
		if(age<20) return -1;
		else return 1;
	}

	@Override
	protected String connection(String info) {
		System.out.println("Last access phase");
		return null;
	}

}

Main class

public class Main {
	public static void main(String[] args) {
		GameConnectHelper helper = new DefaultGameConnectHelper();
		
		helper.requestConnection("login Info");
	}
}

 

 

- 설명

 

템플릿메소드패턴을 위와 같이 간단하게 볼 수 있따

 

일련의 메소드를 한꺼번에 실행할 수 있는 메소드를 하나 정의하고(이 메소드는 변경되어선 안된다),

 

재정의가 가능한 메소드들을 만들어서 요구사항에 따라 해당 과정에서 수행되는 일을 변경할 수 있다