Template Method Pattern
알고리즘의 구조를 메소드에 정의하고 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의 하는 패턴
언제 사용할까?
구현하려는 알고리즘이 일정한 프로세스가 있다.
구현하려는 알고리즘이 변경가능성이 있다.
Process
알고리즘을 여러 단계로 나눈다.
나누어진 알고리즘의 단계를 메소드로 선언한다.
알고리즘을 수행할 템플릿 메소드를 만든다.
하위 클래스에서 나눠진 메소드들을 구현한다.
요구사항
신작 게임의 접속을 구현해주세요.
requestConnection(String str):String
유저가 게임 접속시 다음을 고려합니다.
1.보안과정: 보안관련부분을 처리합니다.
doSecurity(String string):String
2.인증과정: username과 password가 일치하는지 확인합니다.
authentication(String id, String password):boolean
3.권한과정: 접속자가 유료회원인지 무료회원인지 게임 마스터 인지 확인합니다.
authorization(String userName):int
4.접속과정: 접속자에게 커넥션 정보를 넘겨줍니다.
connection(String info):String
추가 요구사항
보안과정 강화(비밀번호 알고리즘 강화)
권한 시간에 따라 다르게 처리
다음 위와 같은 요구사항을 Template Method Design Pattern으로 구현을 진행해보겠습니다.
알고리즘의 구조를 메소드에 정의하고 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의하여 라이브러리처럼 사용한다라고도 할 수 있겠네요. 그리고 접근지정자를 protected를 사용하므로써 해당되는 패키지에서만 사용이 가능하므로 외부에서의 접근을 막을 수도 있어보입니다. 즉, 다른 패키지를 구현하여 해당 메소드를 구현하면 외부에서 접근이 불가능하게 처리할 수 있습니다. Java OOP의 특징중 캡슐화에 대한 내용이기때문에 잘 모르시는 분들이 있다면 추상성, 상속성, 캡슐화, 다형성에 대해서 공부해오시는것을 추천드립니다.
아래의 코드는 게임을 접속할때 보안작업부터 인증, 인가, 접속까지 Template Method Pattern을 사용하여 만든 예제입니다.
Code
AbstGameConnectHelper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 package TemplateMethodPattern;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 = "kgh" ; String password = "kgh" ; if (!authentication(id, password)){ throw new Error("is not validation id and password" ); } String userName = "kgh-User" ; int authorization = authorization(userName); switch (authorization){ case -1 : throw new Error("after 10 pm Shut Down!" ); case 0 : System.out.println("game Manager!" ); break ; case 1 : System.out.println("Free members" ); break ; case 2 : System.out.println("Paid Members" ); break ; case 3 : System.out.println("Not authorized" ); break ; default : System.out.println("etc case" ); } return connection(decodedInfo); } }
DefaultGameConnectHelper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package TemplateMethodPattern;public class DefaultGameConnectHelper extends AbstGameConnectHelper { @Override protected String doSecurity (String string) { System.out.println("decoded" ); return string; } @Override protected boolean authentication (String id, String password) { System.out.println("is Check id, password" ); return true ; } @Override protected int authorization (String userName) { System.out.println("Authorization Confirm" ); return 0 ; } @Override protected String connection (String info) { System.out.println("Last Connection Step!" ); return info; } }
Main
1 2 3 4 5 6 7 8 9 package TemplateMethodPattern;public class Main { public static void main (String[] args) { AbstGameConnectHelper helper = new DefaultGameConnectHelper(); helper.requestConnection("Id Password, etc. Connection Information" ); } }