해석 모드 : (14)에 설명 된 자바 디자인 패턴

이 문서 자료 : 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

추천

출처www.cnblogs.com/cicada-smile/p/11695393.html