pattern

Interpreter pattern

easy16 2018. 7. 20. 17:58

Interpreter pattern


-grammar 또는 expression을 평가하는 pattern

-behavioral pattern 중 하나.


-expression interface을 구현하며 특정 context를 해석하는 역할을 한다.

-SQL parsing이나 symbol processing에 사용함.



Jone과 John이 다름을 구별해 내는데 성공함. 

filter pattern과 굉장히 유사하게 보인다.


Main 호출 부


    //Rule: Robert and John are male
    public static Expression getMaleExpression(){
        Expression robert = new TerminalExpression("Robert");
        Expression john = new TerminalExpression("Jone");
        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(){
        Expression isMale = getMaleExpression();
        Expression isMarriedWoman = getMarriedWomanExpression();

        Log.d("hello", "John is male? ="+isMale.interpret("John"));
        Log.d("hello","Julie is married woman ? ="+isMarriedWoman.interpret("Married Julie"));
    }


common interface.

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


TerminalExpression.java
public class TerminalExpression implements Expression {

    private final String data;

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

    @Override
    public boolean interpret(String context) {

        if (context.contains(data)){
            return true;
        }

        return false;
    }
}


AndExpression.java
public class AndExpression implements Expression {

    private final Expression exp1;
    private final Expression exp2;

    public AndExpression(Expression exp1, Expression exp2){
        this.exp1=exp1;
        this.exp2=exp2;
    }

    @Override
    public boolean interpret(String context) {
        return exp1.interpret(context) && exp2.interpret(context);
    }
}


OrExPression.java
public class OrExPression implements Expression {

    private final Expression exp1;
    private final Expression exp2;

    public OrExPression(Expression exp1, Expression exp2){
        this.exp1=exp1;
        this.exp2=exp2;
    }

    @Override
    public boolean interpret(String context) {
        return exp1.interpret(context)||exp2.interpret(context);
    }
}

결과 :
07-20 17:52:50.382 17583 17583 D hello   : John is male? =false
07-20 17:52:50.382 17583 17583 D hello   : Julie is married woman ? =true

참조: