디자인 모델 학습 총화 (16) - 해석 기 모델

3406 단어
정의.
해석 기 모드 (Interpreter) 는 언어 를 정 하고 문법 을 정의 하 며 해석 기 를 정의 합 니 다. 이 해석 기 는 이 표현 을 사용 하여 언어의 문장 을 설명 합 니 다.
역할.
  • AbstractExpression: 추상 적 표현 식.추상 적 인 해석 작업 을 설명 합 니 다. 이 인 터 페 이 스 는 추상 문법 트 리 의 모든 노드 공유 입 니 다.
  • Terminal Expression: 종결 부 표현 식.문법 중의 종결 부 와 관련 된 해석 조작 을 실현 하 다.추상 적 표현 식 에서 요구 하 는 방법 을 실현 하 다.문법 에서 모든 종결 부 호 는 구체 적 인 종결 표현 식 과 대응 된다.
  • Nonterminal Expression: 비 종결 부 표현 식.문법 중의 비 종결 부 와 관련 된 해석 작업.
  • Context: 환경 류.해석 기 이외 의 전역 정 보 를 포함 합 니 다.

  • Client: 고객 류.

  • 장단 점
    장점:
  • 확장 성 이 좋 고 유연 합 니 다.
  • 새로운 해석 식 방식 이 추가 되 었 습 니 다.
  • 문법 을 실현 하기 쉽다.

  • 단점:
  • 집행 효율 이 비교적 낮 고 장면 을 이용 할 수 있 는 것 이 비교적 적다.
  • 복잡 한 문법 에 대해 유지 하기 어렵다.

  • 실례 (곱셈 공식 을 예 로 들 면)
    정의 노드 인터페이스:
    /**
     *   
     */
    public interface Node {
    
        /**
         *   
         *
         * @return
         */
        int interpret();
    }

    노드 구체 적 인 실현 클래스:
    /**
     *    
     */
    public class ValueNode implements Node{
    
        private int value;
    
        public ValueNode(int value){
            this.value = value;
        }
    
        @Override
        public int interpret() {
            return this.value;
        }
    }
    
    
    /**
     *        
     */
    public abstract class SymbolNode implements Node {
    
        protected Node left;
        protected Node right;
    
        public SymbolNode(Node left, Node right) {
            this.left = left;
            this.right = right;
        }
    }
    
    /**
     *   
     */
    public class MultiplyNode extends SymbolNode{
    
        public MultiplyNode(Node left, Node right) {
            super(left, right);
        }
    
        @Override
        public int interpret() {
            return left.interpret() * right.interpret();
        }
    }
    
    /**
     *   
     */
    public class DivisionNode extends SymbolNode {
        public DivisionNode(Node left, Node right) {
            super(left, right);
        }
    
        @Override
        public int interpret() {
            return left.interpret() / right.interpret();
        }
    }
    

    계산기:
    public class Calculator {
    
        private Node node;
    
        public void build(String statement) {
            Node left,right;
            Stack stack = new Stack();
    
            String[] statementArr = statement.split(" ");
    
            for (int i = 0; i < statementArr.length; i++) {
                if (statementArr[i].equalsIgnoreCase("*")) {
                    left = (Node) stack.pop();
                    int val = Integer.parseInt(statementArr[++i]);
                    right = new ValueNode(val);
                    stack.push(new MultiplyNode(left, right));
                } else if (statementArr[i].equalsIgnoreCase("/")) {
                    left = (Node) stack.pop();
                    int val = Integer.parseInt(statementArr[++i]);
                    right = new ValueNode(val);
                    stack.push(new DivisionNode(left, right));
                } else {
                    stack.push(new ValueNode(Integer.parseInt(statementArr[i])));
                }
            }
            this.node = (Node) stack.pop();
        }
    
        public int compute() {
            return node.interpret();
        }
    }

    테스트:
    public static void main(String[] args) {
        String statement = "3 * 2 * 4 / 6";
    
        Calculator calculator = new Calculator();
    
        calculator.build(statement);
    
        int result = calculator.compute();
    
        System.out.println(statement + " = " + result);
    }

    콘 솔 출력:
    3 * 2 * 4 / 6 = 4

    좋은 웹페이지 즐겨찾기