You will be fine

<디자인패턴입문> 20. Interpreter 패턴

by BFine
반응형

www.yes24.com/Product/Goods/2918928

 

Java 언어로 배우는 디자인 패턴 입문

이 책은 디자인 패턴의 입문서입니다. GoF가 정리한 23개의 디자인 패턴을 하나씩 다루면서 객체 지향을 잘 모르는 초보자도 이해하기 쉽도록 정리하고 있습니다. 단순한 이론이나 논리을 제시하

www.yes24.com

 

가. 무엇인가

 a. 문법규칙을 클래스로!

  -  디자인 패턴의 목적중 하나는 클래스의 재사용성을 높이기 위한 것이다.

      => 한번 작성한 클래스를 수정(최소한)하지 않고 몇번이고 사용할 수 있도록 하는 것이다. 

  -  인터프리터 패턴에서는 구현하려는 문제를 간단한 미니언어로 표현한다.

      => 미니언어로 기술된 미니 프로그램으로 표현한다.

  -  이 미니 프로그램은 그 자체로는 동작하지 않기 때문에 Java 언어로 통역하는 역할(interpreter)이 있어야 한다.

  -  문제에 변화가 발생하면 통역역할을 수정하는 것이 아니라 미니 프로그램쪽을 수정해서 대처한다.

 

나. 예제

sql문처럼 문법에 대응하여 데이터를 처리하는 예제

 a. AbstractExpression(추상적인 표현)의 역할

  -  구문의 트리의 노드에 공통의 인터페이스를 결정하는 역할이다.

public abstract class AbstractExpression {
    protected abstract void interpret(Context context) throws Exception;
}

 b. NonterminalExpression()의 역할

  -  구문 트리의 마지막 계층이 아닌 요소들을 의미한다.

  -  각각의 요소들은 체인형태로 담당 계층에 대한 처리를 하고 다른계층으로 전달한다. 

public class BeginExpression extends AbstractExpression{
    private final AbstractExpression abstractExpression = new LocationExpression();

    public String interpret(Context context) throws Exception {
        return interpret(context,"");
    }
    @Override
    protected String interpret(Context context, String key) throws Exception {
        if("위치".equals(context.nextToken())){
           return abstractExpression.interpret(context,key);
        }
        throw new Exception("시작구문 오류");
    }
}

public class LocationExpression extends AbstractExpression{

    private AbstractExpression abstractExpression;
    @Override
    protected String interpret(Context context, String key) throws Exception {
        key = context.nextToken();
        String process = context.nextToken();
        if("찾기".equals(process)){
            abstractExpression = new FindExpression();
        }
        if("삭제".equals(process)){
            abstractExpression = new DeleteExpression();
        }

       return abstractExpression.interpret(context, key);
    }
}

 c. TerminalExpression의 역할

  -   특정한 처리루프의 마지막을 담당하며 로직뿐만 아니라 단순데이터를 리턴할수도 있다. 

public class DeleteExpression extends AbstractExpression {
    @Override
    protected String interpret(Context context, String key) {
        String productType = context.nextToken();
        Map<String, List<String>> itemMap = DataBase.store.get(key);
        List<String> remove = itemMap.remove(productType);

        return "remove " + remove.size() + " rows";
    }
}

public class FindExpression extends AbstractExpression{
    @Override
    protected String interpret(Context context, String key) {
        String productType = context.nextToken();
        Map<String, List<String>> itemMap = DataBase.store.get(key);
        StringBuilder data = new StringBuilder(key).append(" : ");

        List<String> productList = 
        		itemMap.getOrDefault(productType, Collections.emptyList());

        data.append(String.join(",",productList));
        return data.toString();
    }
}

 d. Context(문맥, 전후 관계)의 역할

  -  인터프리터가 구문해석을 실행하기 위한 정보를 제공하는 역할을 한다.

public class Context {

    private final StringTokenizer tokens;

    public Context(String wsql) {
        this.tokens = new StringTokenizer(wsql);
    }

    public String nextToken(){
        return tokens.nextToken();
    }
}

 e. Main (Client)

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        for (int testIndex = 0; testIndex < 3; testIndex++) {
            String input = scanner.nextLine();
            // 시스템입력 : 위치 [제조사] 찾기 [분류]
            Context context = new Context(input);
            BeginExpression beginExpression = new BeginExpression();
            System.out.println(beginExpression.interpret(context));
        }
    }
}

/**
"C:\Program Files\Java\jdk1.8.0_251\bin\java.exe" 
위치 samsung 찾기 tablet
samsung : gtab S7,gtab A7
위치 apple 찾기 phone
apple : iphone se,iphone 12
위치 apple 삭제 phone
remove 2 rows
*/

다. 정리

 a. 건너 뛸까, 읽을까

  -  자주 발생하는 문제는 토큰을 많이 읽거나 혹은 적게 읽는 경우이다.

     => 항상 어디까지 토큰을 읽었는지, 어디까지 읽을 것인지를 염두에 두고 있어야한다.

interpreter 패턴은 어떠한 문제를 언어로 보고 해당 키워드를 클래스화하여 문제를 처리하는 패턴이다.  

 

반응형
블로그의 프로필 사진

블로그의 정보

57개월 BackEnd

BFine

활동하기