이 문서 자료 : GitHub의이 · 여기를 클릭 || GitEE · 여기를 클릭하십시오
a 모드를 설명
1, 기본 개념
통역 패턴은 객체의 행동의 패턴이다. 통역을 제공하면서 주어진 언어 후, 통역 모드는 그 문법 표현 중 하나를 정의 할 수 있습니다. 클라이언트는 표현의 언어를 해석하는 인터프리터를 사용할 수 있습니다.
2 패턴을 도시
3, 핵심 역할
(1), 추상적 인 표현
익스프레스 : 작업을 설명하기 위해 호출 주요 해석 () 메소드를 제공하는 추상 인터페이스의 역할을 달성하기 위해 필요한 구체적인 표현을 선언합니다.
(2) 식 터미네이터
TerminalExpress : 추상적 표현 구현 인터페이스의 역할을 주로 해석 () 메소드 각 터미널 심볼은 이에 대응하는 특정 식 단부를 갖는다. 이러한 파싱 C = A + B, A와 B와 같은 파싱 터미네이터는이고 B는 터미네이터 식 인터프리터이다.
(3) 식 비단
NotTerminalExpress 각 규칙은 특정 융합 비단 식 필요는 일반적으로 결정 또는 C = A + B "+"이고 비단 분석 논리 연산자 "+"인터프리터 지칭 비단 표현이다.
(4) 상기 컨테이너 환경
데이터 맵 : 일반적으로 C = A + B가 C = 1 + 2 변환 등 터미네이터의 각각에 대응하는 특정 값을 저장하는 데 사용된다. 이 정보는 스토리지 환경을 필요로한다.
도 4에서, 소스 코드를 달성
- 도 클래스 구조.
- 소스 코드 구현
public class C01_InScene {
public static void main(String[] args) {
DataMap dataMap = new DataMap();
TerminalExpress terminalExpress1 = new TerminalExpress("num1");
TerminalExpress terminalExpress2 = new TerminalExpress("num2");
TerminalExpress terminalExpress3 = new TerminalExpress("num3");
dataMap.putData(terminalExpress1, 1);
dataMap.putData(terminalExpress2, 2);
dataMap.putData(terminalExpress3, 3);
// 1+2-3 = 0
System.out.println(new Minus(
new Add(terminalExpress1,terminalExpress2), terminalExpress3)
.interpret(dataMap));
}
}
// 解释器接口
interface Express {
Integer interpret(DataMap dataMap) ;
}
// 非终结符表达式
abstract class NotTerminalExpress implements Express {
Express express1,express2;
public NotTerminalExpress(Express express1, Express express2){
this.express1 = express1;
this.express2 = express2;
}
}
// 终结符表达式: 1+2 终结符: 1 和 2
class TerminalExpress implements Express {
public String field ;
public TerminalExpress (String field){
this.field = field ;
}
@Override
public Integer interpret(DataMap dataMap) {
return dataMap.getData(this);
}
}
// 加法表达式
class Add extends NotTerminalExpress {
public Add (Express e1, Express e2) {
super(e1, e2);
}
// 将两个表达式相减
@Override
public Integer interpret(DataMap context) {
return this.express1.interpret(context) + this.express2.interpret(context);
}
}
// 减法表达式
class Minus extends NotTerminalExpress {
public Minus (Express e1, Express e2) {
super(e1, e2);
}
// 将两个表达式相减
@Override
public Integer interpret(DataMap context) {
return this.express1.interpret(context) - this.express2.interpret(context);
}
}
// 数据容器
class DataMap {
private Map<Express,Integer> dataMap = new HashMap<>() ;
public void putData (Express key,Integer value){
dataMap.put(key,value) ;
}
public Integer getData (Express key){
return dataMap.get(key) ;
}
}
두, 스프링 프레임 워크 응용 프로그램
1 소스 케이스
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class SpringTest {
public static void main(String[] args) {
SpelExpressionParser parser = new SpelExpressionParser () ;
Expression expression = parser.parseExpression("(1+3-2)*3") ;
Integer result = (Integer)expression.getValue() ;
System.out.println("result="+result);
}
}
2 코드 분석
(1) 식 구조
식 인터페이스 : 다른 구현 클래스.
interface Expression
class CompositeStringExpression implements Expression
class LiteralExpression implements Expression
class SpelExpression implements Expression
핵심 방법 :
Object getValue() throws EvaluationException;
(2) SpelExpressionParser 结构
SpelExpressionParser extends TemplateAwareExpressionParser
TemplateAwareExpressionParser implements ExpressionParser
interface ExpressionParser
(3) 인터페이스 ExpressionParser
public interface ExpressionParser {
Expression parseExpression(String var1) ;
Expression parseExpression(String var1, ParserContext var2) ;
}
(4) 식 가져
다른 조건 하에서 다른 구하는 식 개체. 여기에 생성 된 클래스 종속성.
소스 위치 : TemplateAwareExpressionParser
public Expression parseExpression(String expressionString,
ParserContext context)
throws ParseException {
if (context == null) {
context = NON_TEMPLATE_PARSER_CONTEXT;
}
return context.isTemplate() ?
this.parseTemplate(expressionString, context) :
this.doParseExpression(expressionString, context);
}
셋째, 모델 요약
- 장면
컴파일러, 운영자 표현, 정규 표현식, 로봇 등이있다.
- 이점
표현이나 해석 언어에 대한 필요가있을 때, 그 양은이 프로그램이 좋은 확장 성을 가질 수 있도록, 인터프리터 등을 사용해서 장면 모드에 대한 고려 될 수있다.
- 결점
통역 패턴이 클래스는,이 프로그램의 실행과 매우 복잡하고 이해하기 쉽지 않다 디버깅으로 이어질 것입니다 확장됩니다.
넷째, 소스 주소
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent