Java/Design Pattern

[디자인 패턴] Template Method Pattren(템플릿 메소드 패턴)

hyerann 2020. 7. 19. 14:02

템플릿 메소드 패턴(Template Method Pattren)

공통적인 프로세스를 묶어 주기

학습 목표

일정한 프로세스를 가진 요구사항을 템플릿 메소드 패턴을 이용하여 구현할 수 있다.

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

  • 수정할 때는 구현 클래스만 수정
  • 효과적인 유지 보수 가능

기본 설계

어떨 때 사용하는 가

  • 구현하려는 알고리즘이 일정한 프로세스가 있다.
    • 여러 단계로 나눌 수 있다.
  • 구현하려는 알고리즘이 변경 가능성이 있다.

사용하는 단계

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

예제

요구 사항

  • 신작 게임의 접속을 구현해주세요.
    • requestConnection(String str): String
  • 유저가 게임 접속 시 다음을 고려해야 합니다.
    • 보안 과정: 보안 관련 부분을 처리합니다.
      • doSecurity(String string): String
    • 인증 과정: user name과 password가 일치하는지 확인합니다.
      • authentication(String id, String password): boolean
    • 권한 과정: 접속자가 유료 회원인지 무료 회원인지 게임 마스터인지 확인합니다.
      • authorization(String userName): int
    • 접속 과정: 접속자에게 커넥션을 정보로 넘겨줍니다.
      • connection(String info): String

AbstGameConnectHelper.java

public abstract class AbstGameConnectHelper {

    //외부에서 호출하면 안되는데 하위 클래스에서 사용할 수 있게 해야 함 -> protected
    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 -1:
                throw new Error("셧 다운");
            case 0:     //게임 매니저
                break;
            case 1:     //유료 회원
                break;
            case 2:     //무료 회원
                break;
            case 3:     //권한 없음
                break;
            default:    //기타 상황
                break;
        }

        return connection(decodedInfo);
    }
 }

 

DefaultGameConnection.java

public class DefaultGameConnection 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("권한 확인");
        //서버에서 유저 이름, 유저의 나이를 알 수 있다.
        //나이와 시간을 확인하여 성인이 아니고 10시가 지났다면 권한이 없는 것으로 한다.
        return 0;
    }

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

 

Main.java

public class Main {

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

        helper.requestConnection("아이디 암호 등 접속 정보");

        //      <결과>
        //디코드
        //아이디/암호 확인 과정
        //권한 확인
        //마지막 접속 단계
    }
}

 

 

www.inflearn.com/course/자바-디자인-패턴/dashboard

 

자바 디자인 패턴의 이해 - Gof Design Pattern - 인프런

자바 디자인 패턴 이해하기 강좌 입니다. 여러가지 디자인 패턴들을 알아보며 디자인 패턴에 대한 이해도를 높이도록 도와줍니다. Gof Design Pattern을 자바 언어로 설명한 강의. 의미 있고 쉬운 예�

www.inflearn.com