Interpreterパターン
Interpreterパターン(通訳・パターン)はモデルのタイプに属する表現構文または言語を、評価するための方法を提供します。 このモードは、特定のコンテキストを説明する表現インタフェースを実装します。 このモデルは、SQLの解析、記号処理エンジンに使用されます。
入門
意図:言語を考えると、その文法表現を定義し、インタプリタを定義し、インタプリタ言語で文章を解釈するためにロゴを使用しています。
主なソリューション:インタプリタを説明する文章を構築するいくつかの固定された文法のために。
使用するときにこの問題の特定の種類の周波数が十分に高い場合、問題の各インスタンスは、言語の単純な文章として表現される価値があるかもしれません。あなたはこれらの文章を解釈することによって、問題を解決するために、通訳、通訳を構築することができるように。
修正方法:メンバーの構文木、ターミネーターおよび非終端の定義を。
キーコード:メンバクラスの環境、インタプリタの外に含まれるいくつかのグローバル情報、通常のHashMap。
アプリケーション例:コンパイラ、算術式の評価。
利点:1、より優れたスケーラビリティ、および柔軟な。2は、表現を解釈する新しい方法を追加しました。 3、簡単な文法を実装するのは簡単。
短所:1、シーンの利点は、比較的小さいとることができます。維持することがより困難で複雑な文法2.。 3モードは、クラスを拡張するようになります説明します。 4再帰的なメソッド呼び出しを使用してモードを説明します。
使用シナリオ:1言語文が抽象構文木によって表現されなければならないと解釈することができます。2、定期的な問題のいくつかは、表現するために、単純な言語とすることができます。 3、シーンを説明するためのシンプルな文法。
注:代わりにexpression4Jでき遭遇した場合は、比較的小さいシーン、JAVAを使用することができます。
実現
私たちは、インターフェイス式式のエンティティクラスのインターフェイスを作成し、実施していきます。 TerminalExpression主要インタープリタの文脈で定義されます。 モジュラー式を作成するための他のクラスOrExpression、AndExpression。
InterpreterPatternDemo、私たちのデモクラスは、構文解析ルールとプレゼンテーション式を作成するにはExpressionクラスを使用しています。
ステップ1
式インターフェイスを作成します。
Expression.java
public interface Expression { public boolean interpret(String context); }
ステップ2
作成したエンティティクラスは、上記のインターフェースを実装しています。
TerminalExpression.java
public class TerminalExpression implements Expression { private String data; public TerminalExpression(String data){ this.data = data; } @Override public boolean interpret(String context) { if(context.contains(data)){ return true; } return false; } }
OrExpression.java
public class OrExpression implements Expression { private Expression expr1 = null; private Expression expr2 = null; 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); } }
AndExpression.java
public class AndExpression implements Expression { private Expression expr1 = null; private Expression expr2 = null; public AndExpression(Expression expr1, Expression expr2) { this.expr1 = expr1; this.expr2 = expr2; } @Override public boolean interpret(String context) { return expr1.interpret(context) && expr2.interpret(context); } }
ステップ3
InterpreterPatternDemoは、ルールを作成し、それらを解決するために、Expressionクラスを使用します。
InterpreterPatternDemo.java
public class InterpreterPatternDemo { //规则:Robert 和 John 是男性 public static Expression getMaleExpression(){ Expression robert = new TerminalExpression("Robert"); Expression john = new TerminalExpression("John"); return new OrExpression(robert, john); } //规则:Julie 是一个已婚的女性 public static Expression getMarriedWomanExpression(){ Expression julie = new TerminalExpression("Julie"); Expression married = new TerminalExpression("Married"); return new AndExpression(julie, married); } public static void main(String[] args) { Expression isMale = getMaleExpression(); Expression isMarriedWoman = getMarriedWomanExpression(); System.out.println("John is male? " + isMale.interpret("John")); System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie")); } }
ステップ4
出力を確認します。
ジョンは男性ですか?真 ジュリーは、既婚女性?Trueです