[디자인패턴]Template Method Pattern

김나우·2022년 8월 31일
0

출처
이야기's G님 유튜브

Template Method Pattern


알고리즘의 구조를 메소드에 정의하고 하위 클래스에서 알고리즘 구조의

변경없이 알고리즘을 재정의하는 패턴

언제 사용하는가?

  • 구현하려는 알고리즘이 일정한 프로세스가 있다.

  • 구현하려는 알고리즘이 변경 가능성이 있다.

어떤 단계로 이루어져 있는가?

  • 알고리즘을 여러 단계로 나눈다.

  • 나눠진 알고리즘의 단계를 메소드로 선언한다.

  • 알고리즘을 수행할 템플릿 메소드를 만든다.

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


예시


요구사항

  • 신작 게임의 접속을 구현해주세요

    • requestConnection(String str) : String
  • 유저가 게임 접속시 다음을 고려해야합니다.

    • 보안 과정 : 보안 관련 부분을 처리합니다

      • doSecurity(String string) : String
    • 인증 과정 : user name과 password가 일치하는지 확인합니다

      • authentication(String id, String password) : boolean
    • 권한 과정 : 접속자가 유로 회원인지 무료회원인지 게임 마스터 인지 확인합니다.

      • authnorization(String userName) : int)
    • 접속 과정 : 접속자에게 커넥션 정보를 넘겨줍니다

      • connection(String info) : String
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 decodeInfo = 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 -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:
                System.out.println("기타 상황");
                break;
        }

        return connection(decodeInfo);
    }

}
public class DefaultGameConnectHelper extends AbstGameConnectHelper{

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

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

    @Override
    protected int authorization(String userName) {
        System.out.println("권한 확인");
        //서버에서 유저이름 유저의 나이를 알 수 있음.
        //나이를 확인하고 시간을 확인하고 성인이 아니고 10시가 지났다면
        //권한이 없는 것으로 한다
        return 0;
    }

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

    public static void main(String[] args) {
        AbstGameConnectHelper helper = new DefaultGameConnectHelper();

        helper.requestConnection("아이디 암호 등 접속 정보");
    }
}
profile
안녕하세요

0개의 댓글