Latest web development tutorials

Interpreter-Muster

Interpreter-Muster (Interpreter Pattern) bietet eine Möglichkeit, den Ausdruck Syntax oder Sprache zu bewerten, die auf die Art des Modells gehört. Dieser Modus setzt einen Ausdruck Schnittstelle, die einen bestimmten Kontext erklären. Dieses Modell wird in der SQL-Parsing, Symbolverarbeitungsmaschinen verwendet.

Einführung

Absichten: eine Sprache, definieren ihre Grammatik Darstellung gegeben, und einen Dolmetscher definieren, verwendet der Interpreter das Logo Sätze in der Sprache zu interpretieren.

Haupt Lösung: Für einige feste Grammatik eines Satzes Konstruktion Dolmetscher zu erklären.

Wenn verwenden: Wenn die Frequenz einer bestimmten Art von Problem ausreichend hoch ist, kann es jede Instanz des Problems wert sein wird als einfache Sätze in der Sprache ausgedrückt.Damit Sie einen Dolmetscher zu bauen, zu der Interpreter das Problem zu lösen, indem sie diese Sätze zu interpretieren.

Wie zu beheben: Mitglied Syntaxbaum, die Definition von Terminator und Nicht - Terminal.

Der Schlüsselcode: Mitglied Klasse Umgebung, einige globale enthaltenen Informationen außerhalb Interpreter, in der Regel HashMap.

Anwendungsbeispiele: Compiler, Arithmetik Ausdrucksauswertung.

Vorteile: 1, eine bessere Skalierbarkeit und Flexibilität.2, hat einen neuen Weg, um den Ausdruck zu interpretieren. 3, einfach einfache Grammatik zu implementieren.

Nachteile: 1, können die Vorteile der Szene nehmen relativ klein ist.2. Für komplexe Grammatiken schwieriger aufrechtzuerhalten. 3 erläutern den Modus bewirkt, dass die Klasse zu erweitern. 4 erläutern den Modus mit rekursiven Methodenaufrufe.

Einsatzszenarien: 1 kann eine Sprache Sätze interpretiert werden müssen , durch eine abstrakte Syntaxbaum dargestellt werden.2, einige der wiederkehrende Probleme kann eine einfache Sprache auszudrücken sein. 3, eine einfache Grammatik, die Szene zu erklären.

Hinweis: Sie können relativ kleine Szene, JAVA , wenn Sie können stattdessen expression4J begegnen.

Realisierung

Wir schaffen und eine SchnittstelleExpressionExpression Entity - Klasse - Schnittstelle implementieren. Wie bereits im Zusammenhang mit der HauptdolmetscherTerminalExpressiondefiniert. Andere KlassenOrExpression,AndExpression für modulare Ausdrücke zu schaffen.

InterpreterPatternDemo,unsere Demonstration Klasse verwendetExpressionKlasse Parsing - Regeln und Präsentation Ausdrücke zu erstellen.

Interpreter Muster UML-Diagramm

Schritt 1

Erstellen Sie einen Ausdruck Schnittstelle.

Expression.java

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

Schritt 2

Erstellen von Entity-Klasse implementiert die oben genannten Schnittstellen.

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);
   }
}

Schritt 3

InterpreterPatternDemoverwenden , um dieExpressionKlassenregeln zu erstellen und sie zu lösen.

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"));
   }
}

Schritt 4

Stellen Sie sicher, ausgegeben.

John ist männlich True
Julie ist eine verheiratete Frauen True