Template Method Pattern

김남건·2021년 8월 5일
0

Design Pattern

목록 보기
3/3
post-thumbnail

Template Method Pattern

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

사용 조건

구현하려는 알고리즘이 정형화된 프로세스가 있으며, 변경 가능성이 클 때 사용한다.

구현 방법

  1. 알고리즘을 여러 단계로 나눈다.
  2. 각 단계를 메서드로 선언한다.
  3. 알고리즘을 수행할 템플릿 메서드를 만든다.
  4. 하위 클래스에서 나눠진 메서드들을 구현한다.

정리하자면 알고리즘을 각 단계로 나누고, 각 단계에 해당하는 메서드는 추상 메서드로 선언하여 하위 클래스에서 구현하도록 하는 방식이다.

예제

요구사항

신작 게임의 접속을 구현하라.
String requestConnection(String str)

유저가 게임 접속시 다음을 고려해야 한다.

보안 과정

보안 관련 부분을 처리한다.
String doSecurity(String string)

인증 과정

user name과 password가 일치하는지 확인한다.
boolean authentication(String id, String password)

권한 과정

접속자가 유료 회원인지 무료 회원인지, 게임 마스터인지 확인한다.
int authorization(String userName)

접속 과정

접속자에게 Connection을 정보로 넘겨준다.
String connection(String info)

구현

1. 알고리즘을 여러 단계로 나눈다.
~ 3. 알고리즘을 수행할 템플릿 메서드를 만든다.

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 decodedInfo = 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 0: // 게임 매니저
                break;
            case 1: // 유료 회원
                break;
            case 2: // 무료 회원
                break;
            case 3: // 권한 없음
                throw Error("셧다운");
                break;
            default: // 기타
                break;
        }

        return connection(decodedInfo);
    }
}

4. 하위 클래스에서 나눠진 메서드들을 구현한다.

public class DefaultGameConnectHelper extends AbstGameConnectHelper {
    @Override
    protected String doSecurity(String string) {
        System.out.println("디코드");
        return null;
    }

    @Override
    protected boolean authentication(String id, String password) {
        System.out.println("아이디 암호 확인");
        return true;
    }

    @Override
    protected int authorization(String userName) {
        System.out.println("권환 확인");
        return 0;
    }

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

추가 요구사항

  1. 보안 부분이 정부 정책에 의해서 강화되어서 강화된 방식으로 코드를 변경해야 한다.

  2. 여가부에서 밤 10시 이후에 접속이 제한 되도록 요구한다.

추가 구현

public class DefaultGameConnectHelper extends AbstGameConnectHelper {
    @Override
    protected String doSecurity(String string) {
        System.out.println("강화된 알고리즘 이용한 디코드"); // 변경
        return null;
    }

    @Override
    protected boolean authentication(String id, String password) {
        System.out.println("아이디 암호 확인");
        return true;
    }

    @Override
    protected int authorization(String userName) {
        System.out.println("권환 확인");
        // 서버에서 유저이름 유저 나이를 알 수 있음
        // 유저 나이와 현재 시간을 확인하여 접속 제한(3을 return)
        
        return 0;
    }

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

변경사항이 있는 경우 하위 클래스에서는 템플릿 메서드를 건드릴 필요 없이 각 단계에 해당하는 메서드를 수정하면 된다.

Reference

https://www.youtube.com/watch?v=qr7I18Lhsl8

0개의 댓글