interface Expression {
int interpret();
}
class NumberExpression implements Expression {
private int number;
NumberExpression(int number) { this.number = number; }
public int interpret() { return number; }
}
class AddExpression implements Expression {
private Expression left, right;
AddExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
public int interpret() {
return left.interpret() + right.interpret();
}
}
class SubtractExpression implements Expression {
private Expression left, right;
SubtractExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
public int interpret() {
return left.interpret() - right.interpret();
}
}
public static void main(String[] args) {
// (5 + 3) - 2
Expression expr = new SubtractExpression(
new AddExpression(
new NumberExpression(5),
new NumberExpression(3)
),
new NumberExpression(2)
);
System.out.println("Result: " + expr.interpret());
}The Interpreter pattern defines a grammar for a language and provides an interpreter to evaluate sentences in that language. It is commonly used for parsing expressions, configuration files, and domain-specific languages (DSLs) by representing each grammar rule as a class.