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
참조: