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());
}
Back to Design Patterns
Behavioral Design Pattern

Interpreter

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.