Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [㉓ Interpreter]

概要

interpreterは日本語で「解釈者」,「説明者」という意味になる.Interpreterパターンは,特定の言語の文法表現と,それを使用して分を解釈するインタープリタを定義するパターンである.

Interpreterパターンの主な要素は以下である.

  • AbstractExpression:抽象的な文法表現を表すインターフェース
  • TerminalExpression:AbstractExpressionを実装した,文法の終端要素を表現するクラス
  • Non-TerminalExpression:AbstractExpressionを実装した,文法の非終端要素を表現するクラス

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

java// AbstractExpression
interface Expression {
    public boolean interpret(String context);
}

// TerminalExpression
class TerminalExpression implements Expression {
    private String data;
    public TerminalExpression(String data) {
        this.data = data;
    }
    @Override
    public boolean interpret(String context) {
        return context.contains(data);
    }
}

// Non-terminalExpression
class OrExpression implements Expression {
    private Expression expr1;
    private Expression expr2;
    public OrExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }
    @Override
    public boolean interpret(String context) {
        return expr1.interpret(context) || expr2.interpret(context);
    }
}

// Client
public class InterpreterPattern {
    public static void main(String[] args) {
        Expression expr1 = new TerminalExpression("Hello");
        Expression expr2 = new TerminalExpression("World");
        
        Expression isHelloOrWorld = new OrExpression(expr1, expr2);

        System.out.println(isHelloOrWorld.interpret("Hello"));
        System.out.println(isHelloOrWorld.interpret("World"));
        System.out.println(isHelloOrWorld.interpret("Hello World"));
        System.out.println(isHelloOrWorld.interpret("Good Morning"));
    }
}

まとめ,所感

あまり使うケースが無いような気がする.

木構造のようなデータ,例えば逆ポーランド記法を解析したいときなどは使えるだろう.文章なんかも各品詞をノードとして木構造で管理できるかもしれないが,今時はAIを使って解析する.

となると,文章以外でのユースケースだが,いまいち思いつかない.