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
참조:
'pattern' 카테고리의 다른 글
| Mediator pattern (0) | 2018.07.24 |
|---|---|
| Iterator Pattern (0) | 2018.07.24 |
| Command pattern (0) | 2018.07.20 |
| Chain of Responsibility Pattern (0) | 2018.07.20 |
| Proxy Pattern (0) | 2018.07.20 |