-
[Design Pattern] 인터프리터(Interpreter) 패턴 - 디자인 패턴CSE/Design Pattern 2015. 6. 13. 10:42
Pattern #13 인터프리터 패턴
간단한 언어의 문법을 정의하고 해석하는데 사용
패턴 요약
- 문법을 재귀적으로 표현
- 집합 객체에게 그 해석을 패스
동기
당신이 새롭게 맡은 일은 전략게임의 인공지능 부분에 대한 설계와 개발 작업이다. 게임의 인공지능은 수 많은 규칙(rule)들에 그 기반을 두고 있는데, 이러한 규칙들을 분석하고 실행하기 위해서는 논리식을 표현하고 계산할 수 있어야 한다. 변수와 논리곱(and), 논리합(or,) 부정(not), 상수(true, false)로 구성된 기본적인 predicate first logic을 표현하고 계산할 수 있는 논리 시스템을 설계하라.
BNF로 문법 표현BNF Syntax를 클래스다이어그램으로 표현- 일반적으로 BNF로 표현된 Syntax의 언어를 분석하면 part-whole 형태의 Tree 구조가 된다.의도- 특정 언어가 주어졌을 때, 이 언어로 작성된 문장을 해석할 수 있도록, 언어의 문법을 표현하고 해석기능을 지원한다.- 간단한 문법에 대한 Interpreter 설계적용범위- 문법이 간단할 때 => 복잡한 문법의 경우 이를 표현하기 위한 class hierarchy가 비대해지고 관리하기 어려워진다.- 성능이 중요한 문제가 되지 않을 때 => Interpreter pattern은 특정 언어로 기술된 문장을 분석해서 객체들의 Tree 구조를 생성하기 때문에 속도나 효율은 떨어질 수 있다.결과- 문법을 변경하고 확장하기 좋음- 문법을 구현하기 쉬움 => Syntax tree의 각 노드들에 표현된 클래스들은 비슷한 구현을 가진다.- 복잡한 문법은 유지하기 어려움 => 문법 규칙이 많아질 수록 클래스 수도 따라 증가하여 관리하기 어려워진다.예제.Expression.java1234567package interpreter;public interface Expression {public String interpret(InterpreterContext ic);}cs InterpreterContext.java
12345678910111213package interpreter;public class InterpreterContext {public String getBinaryFormat(int i) {return Integer.toBinaryString(i);}public String getHexadecimalFormat(int i) {return Integer.toHexString(i);}}cs IntToBinaryExpression.java1234567891011121314151617package interpreter;public class IntToBinaryExpression implements Expression {private int i;public IntToBinaryExpression(int i) {this.i = i;}public String interpret(InterpreterContext ic) {return ic.getBinaryFormat(this.i);}}cs IntToHexExpression.java
1234567891011121314151617package interpreter;public class IntToHexExpression implements Expression {private int i;public IntToHexExpression(int i) {this.i = i;}public String interpret(InterpreterContext ic) {return ic.getHexadecimalFormat(i);}}cs InterpreterMain.java
12345678910111213141516171819202122232425262728293031323334353637package interpreter;public class InterpreterMain {public InterpreterContext ic;public InterpreterMain(InterpreterContext i) {this.ic = i;}public String interpret(String str) {Expression exp = null;if (str.contains("Hexdecimal")) {exp = new IntToHexExpression(Integer.parseInt(str.substring(0,str.indexOf(" "))));} else if (str.contains("Binary")) {exp = new IntToBinaryExpression(Integer.parseInt(str.substring(0,str.indexOf(" "))));} else {return str;}return exp.interpret(ic);}public static void main(String[] args) {String str1 = "28 in Binary";String str2 = "28 in Hexadecimal";InterpreterMain ec = new InterpreterMain(new InterpreterContext());System.out.println(str1 + "= " + ec.interpret(str1));System.out.println(str2 + "= " + ec.interpret(str2));}}cs 'CSE > Design Pattern' 카테고리의 다른 글
[Design Pattern] 옵저버(Observer) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 중재자(Mediator) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 반복자(Iterator) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 플라이웨이트(Flyweight) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 브릿지(Bridge) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 프록시(Proxy) 패턴 (0) 2015.06.13