반응형

Design Patterns - Interpreter Pattern


(원문 위치 : http://www.tutorialspoint.com/design_pattern/interpreter_pattern.htm )

인터프리터 패턴은 언어의 문법 또는 표현을 평가하기 위한 방법을 제공한다. 이 형태의 패턴은 행동적(behavioral) 패턴에 포함된다. 이 패턴은 특정 context를 번역(interpret)하는 것을 지시하는 표현(expression)인터페이스를 구현하는 것을 수반한다. 이 패턴은 SQL 파싱, 심볼 ㅓ리 엔진등에서 사용되어진다.

Implementation

표현(Expression)인터페이스를 생성하고 Expression 인터페이스를 구현하는 구체적 클래스를 생성할 것이다. TerminalExpression 클래스는 질문에서 context의 주요 해석기(main interpreter)로써 동작하도록 정의된다. AndExpression은 복합적(conbinational) 표현을 생성하기 위해 사용되어진다.

InterpreterPatternDemo, 데모 클래스는 규칙(rule)을 생성하고 표현을 파싱하는 것을 보이기 위해 Expression 클래스를 사용한다.

Interpreter Pattern UML Diagram

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


반응형

+ Recent posts