[행위 패턴] Interpreter pattern (인터프리터 패턴)
어떤 언어에 대한 인터프리터를 만들 때
(원문 위치 : http://www.tutorialspoint.com/design_pattern/interpreter_pattern.htm )
인터프리터 패턴은 언어 문법이나 표현을 평가할 수있는 방법을 제공합니다. 이 유형의 패턴은 행동 패턴에 속합니다. 이 패턴은 특정 컨텍스트를 해석하도록 지시하는 표현 인터페이스를 구현하는 것을 포함합니다. 이 패턴은 SQL 구문 분석, 기호 처리 엔진 등에서 사용됩니다.
Implementation
표현(Expression)인터페이스를 생성하고 Expression 인터페이스를 구현하는 구체적 클래스를 생성할 것이다. TerminalExpression 클래스는 질문에서 context의 주요 해석기(main interpreter)로써 동작하도록 정의된다. AndExpression은 복합적(conbinational) 표현을 생성하기 위해 사용되어진다.
InterpreterPatternDemo, 데모 클래스는 규칙(rule)을 생성하고 표현을 파싱하는 것을 보이기 위해 Expression 클래스를 사용한다.
Step 1
expression 인터페이스를 생성한다.
Expression.java
public interface Expression { public boolean interpret(String context); }
Step 2
위 인터페이스를 구현하는 구체적 클래스를 생성한다.
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); } }
Step 3
InterpreterPatternDemo는 규칙(rule)을 생성하고 그것을 파싱하기 위해 Expression 클래스를 사용한다.
InterpreterPatternDemo.java
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")); } }
Step 4
결과를 확인한다.
John is male? true Julie is a married women? true
'Development > Java' 카테고리의 다른 글
[행위 패턴] Memento pattern (메멘토 패턴) (0) | 2017.03.26 |
---|---|
[행위 패턴] Mediator pattern (미디에이터 패턴) (0) | 2017.03.26 |
[구조 패턴] Flyweight pattern (플라이웨이트 패턴) (0) | 2017.03.26 |
[행위 패턴] Chain of responsibility pattern (역할 사슬 패턴) (0) | 2017.03.26 |
[생성 패턴] Builder pattern (빌더 패턴) (0) | 2017.03.26 |