본문 바로가기

IT/디자인 패턴(Design Pattern)

[디자인 패턴] 인터프리터 패턴(Interpreter Pattern)

1) 개요

문법 규칙을 클래스화 한 구조로, 일련의 규칙으로 정의된 문법적 언어를 해석하는 패턴입니다.(SQL, SHELL...) 인터프리터 패턴은 SQL과 같은 계층적 언어를 해석하기 위해 계층 구조를 표현할 수 있습니다.


- 장점

1. 문법의 추가 및 수정, 구현이 쉬워집니다.


- 단점

1. 복잡한 문법의 경우 관리 및 유지가 어려워집니다.


2) UML


- AbstractExpression : interpret()를 정의 합니다.

- TerminalExpression : interpret()를 구현합니다

- NonTerminalExpression : Non-Terminal의 interpret()를 구현합니다.

- Context : String 표현식이어야 하며, 인터프리터에 보내는 정보입니다.

- Client : interpret()를 호출합니다.


3) 예제

1
2
3
4
public interface Expression {
    boolean interpreter(String con);
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TerminalExpression implements Expression{
    String data;
    
    public TerminalExpression(String data) {
        this.data = data;
    }
    
    @Override
    public boolean interpreter(String con) {
        
        if(con.contains(data)) return true;
        else return false;
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class OrExpression implements Expression{
    Expression expr1;
    Expression expr2;
    
    public OrExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }
    
    public boolean interpreter(String con) {
        return expr1.interpreter(con) || expr2.interpreter(con);
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class AndExpression implements Expression{
    Expression expr1;
    Expression expr2;
    
    public AndExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }
    
    @Override
    public boolean interpreter(String con) {
        return expr1.interpreter(con) && expr2.interpreter(con);
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main {
    public static void main(String[] args) {
        Expression person1 = new TerminalExpression("Kushagra"); 
        Expression person2 = new TerminalExpression("Lokesh"); 
        Expression isSingle = new OrExpression(person1, person2); 
          
        Expression vikram = new TerminalExpression("Vikram"); 
        Expression committed = new TerminalExpression("Committed"); 
        Expression isCommitted = new AndExpression(vikram, committed);     
  
        System.out.println(isSingle.interpreter("Kushagra")); 
        System.out.println(isSingle.interpreter("Lokesh")); 
        System.out.println(isSingle.interpreter("Achint")); 
          
        System.out.println(isCommitted.interpreter("Committed, Vikram")); 
        System.out.println(isCommitted.interpreter("Single, Vikram")); 
    }
}
 
cs