통역 패턴
인터프리터 패턴 (인터프리터 패턴) 모델 형에 속하는 표현 구문 또는 언어를 평가하는 방법을 제공한다. 이 모드는, 특정 콘텍스트를 설명하는 식 인터페이스를 구현한다. 이 모델은 SQL 구문 분석에 기호 처리 엔진을 사용한다.
소개
의도 : 언어 감안할 때, 그 문법 표현을 정의하고 통역을 정의, 인터프리터 언어로 문장을 해석하는 로고를 사용합니다.
주요 솔루션 : 통역을 설명하는 문장을 구성하는 몇 가지 고정 문법하십시오.
사용할 때 문제가 특정 유형의 주파수가 충분히 높은 경우,이 문제의 각 인스턴스는 언어의 단문로 표현 가치가있을 수있다.통역을 구축 할 수 있도록, 인터프리터는이 문장을 해석하여 문제를 해결합니다.
해결 방법 : 멤버 구문 트리, 종료 및 비 터미널의 정의를.
키 코드 : 멤버 클래스 환경은 일부 글로벌 정보의 HashMap 일반적으로, 외부 인터프리터가 포함되어 있습니다.
적용 예 : 컴파일러, 연산 식 평가.
장점 : 1, 더 나은 확장 성 및 유연성.2 발현을 해석하는 새로운 방법을 추가했습니다. 3 쉽고 간단한 문법을 구현한다.
단점 : 1, 장면의 장점은 상대적으로 작은 수 있습니다.복잡한 2. 유지 관리가 더 어려운 문법. 3 모드가 클래스를 확장하게됩니다 설명합니다. 4 재귀 메소드 호출을 이용하여 모드를 설명한다.
사용 시나리오 : 1 언어 문장은 추상 구문 트리로 표현되어야 해석 될 수있다.도 2는 반복적 인 문제 중 일부 표현하는 간단한 언어 일 수있다. 3, 간단한 문법 장면을 설명합니다.
참고 : 대신 expression4J 수 있습니다 발생하는 경우가상대적으로 작은 장면, JAVA를 사용할 수 있습니다.
실현
우리는 생성하고 인터페이스식표현 엔티티 클래스 인터페이스를 구현합니다.TerminalExpression주체 통역자의 문맥에서 정의 된 바와 같다. 다른 클래스는 모듈 식을만들기위한,AndExpression을OrExpression.
InterpreterPatternDemo,우리의 데모 클래스는 구문 분석 규칙 및 프리젠 테이션 식을 만드는식의클래스를 사용합니다.
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 규칙을만들고이를 해결하기 위해식 클래스를 사용합니다.
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입니다