인터프리터 패턴은 자주 등장하는 문제를 간단한 언어로 정의하고 재사용하는 패턴이다. 인터프리터 패턴을 사용하면 반복되는 문제 패턴을 언어 또는 문법으로 정의하고 확장할 수 있다. 쉽게 말하면, 일정한 형식을 갖춘 텍스트(String)를 해석해서 규칙에 맞는 로직을 실행할 수 있도록 하는 것이다.
어떤 용도로, 어떤 언어를 구현하는지에 따라 정말 다양한 코드가 나올 수 있지만, 보통 명령을 입력받아 해석하는 Parser와 그것을 바탕으로 로직을 실행하는 Expression으로 나뉜다.
항이 2개인 간단한 덧셈, 뺄셈 식 계산을 인터프리터 패턴으로 구현했다.
public interface Expression {
Integer interpret(String context);
}
@NoArgsConstructor
public class PlusExpression implements Expression{
@Override
public Integer interpret(String context) {
if (context.contains("+")) {
try {
String[] split = context.split("\\+", 2);
return Integer.parseInt(split[0]) + Integer.parseInt(split[1]);
} catch (Exception e) {
return null;
}
} else {
return null;
}
}
}
@NoArgsConstructor
public class MinusExpression implements Expression {
@Override
public Integer interpret(String context) {
if (context.contains("-")) {
try {
String[] split = context.split("-", 2);
return Integer.parseInt(split[0]) - Integer.parseInt(split[1]);
} catch (Exception e) {
return null;
}
} else {
return null;
}
}
}
public class App {
public static void main(String[] args) {
PlusExpression plusExpression = new PlusExpression();
MinusExpression minusExpression = new MinusExpression();
System.out.println("1 + 2 = " + plusExpression.interpret("1+2"));
System.out.println("3 - 2 = " + minusExpression.interpret("3-2"));
}
}
//실행 결과
1 + 2 = 3
3 - 2 = 1
이 링크로 가면 코드를 볼 수 있다.