Interpreter Pattern

2 분 소요


1. 인터프리터 패턴(Interpreter Pattern)이란?

Interpreter의 사전적 해석 : 통역사

문장을 해석할 때 사용하는 패턴.
해석기, 즉 한 언어에서 문들을 평가하는 방법을 규정하는 디자인 패턴이다.



2. 인터프리터 패턴의 역할

1) UML

interpreterUML

추상적인 표현을 client가 구문을 이용하여 구체적인 표현들을 정의한다.


2) 역할

간단한 쉘커먼드 처리, 통신 프로토콜처리, 수식계산, 도메인 기반 언어(Domain Specific Language - SQL, XML, JSF등)의 해석에 주로 많이 쓰인다.
일반프로그래밍 언어처럼 문장구성이 복잡해지면 사용하지 않는 것이 낫다.

ex ) 2 add 3
피연산자 : 2,3 / 연산자 : +
위와 같이 규정을 통해 구문 해석이 가능하다.


3. 문제

1) 문제

and, or을 이용하여 interpreter pattern을 구현하고자 한다.
① Rule: “Robert” and “John” are male (Or)
② Rule: “Julie” is a “married” women (And)

Expression 인터페이스를 이용해
TerminalExpression, AndExpression, OrExpression 클래스를 재정의하고,
AndExpression(“julie”,”married”)객체와,
OrExpression(“Robert”,”John”)객체를 활용하여
Expression객체(isMale,isMarriedWoman)를 생성하고 함수를 생성해보자.

2) UML

UML

3) 역할

위 UML를 참조하여 아래 다섯 개의 클래스 및 인터페이스를 구현해보아라.

● Expression 인터페이스 - context 매개변수를 포함하는 boolean type의 interpret 함수를 갖고있다.

아래 3개의 클래스는 Expression인터페이스를 재정의하는 클래스
● TerminalExpression 클래스 - data 매개변수를 이용하여 생성자로 초기화한다.
● AndExpression 클래스 - interpret함수 재정의시 생성자에 의해 초기화한 두 매개변수를 interpret 함수안에서 and 연산과정을 return 해준다.
● OrExpression 클래스 - interpret함수 재정의시 생성자에 의해 초기화한 두 매개변수를 interpret 함수안에서 or 연산과정을 return 해준다.

● Main 클래스 - 
① TerminalExpression,OrExpression클래스를 이용해 "Robert","John"를 Expression 형으로 객체를 생성한다.
② TerminalExpression,AndExpression클래스를 이용해 "julie","married"를 Expression 형으로 객체를 생성한다.

4) 해답

Expression.java

public interface Expression {
    public boolean interpret(String context);
}


TerminalExpression.java

public class TerminalExpression implements Expression {

    private String data;

    public TerminalExpression(String data) {
        this.data = data;
    }

    @Override
    public boolean interpret(String context) {
        
        if(context.contains(data)){
            return true;
        }
        return false;
    }
}


OrExpression.java

public class OrExpression implements Expression {

    private Expression expr1 = null;
    private Expression expr2 = null;

    public OrExpression(Expression expr1, Expression expr2){
        this.expr1 = expr1;
        this.expr2 = expr2;
    }

    @Override
    public boolean interpret(String context) {
        return expr1.interpret(context) || expr2.interpret(context);
    }
}


AndExpression.java

public class AndExpression implements Expression {

    private Expression expr1 = null;
    private Expression expr2 = null;

    public AndExpression(Expression expr1, Expression expr2){
        this.expr1 = expr1;
        this.expr2 = expr2;
    }

    @Override
    public boolean interpret(String context) {
        return expr1.interpret(context) && expr2.interpret(context);
    }
}


InterpreterPatternDemo.java(main)

public class InterpreterPatternDemo {
    // Rule: Robert and John are male
    public static Expression getMaleExpression(){
        Expression robert = new TerminalExpression("Robert");
        Expression john = new TerminalExpression("John");
        return new OrExpression(robert, john);
    }

    // Rule: Julie is a married women
    public static Expression getMarriedWomanExpression(){
        Expression julie = new TerminalExpression("Julie");
        Expression married = new TerminalExpression("Married");
        return new AndExpression(julie, married);
    }


    public static void main(String[] args) {
        Expression isMale = getMaleExpression();
        Expression isMarriedWoman = getMarriedWomanExpression();

        System.out.println("John is male? " + isMale.interpret("John"));
        System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie"));
    }
}


▶︎ 출력

John is male? true
Julie is a married women? true

# 참조 사이트

댓글남기기