[행위 패턴] Interpreter pattern (인터프리터 패턴)


어떤 언어에 대한 인터프리터를 만들 때

 

 

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

인터프리터 패턴은 언어 문법이나 표현을 평가할 수있는 방법을 제공합니다. 이 유형의 패턴은 행동 패턴에 속합니다. 이 패턴은 특정 컨텍스트를 해석하도록 지시하는 표현 인터페이스를 구현하는 것을 포함합니다. 이 패턴은 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


 

Posted by kunoo
,