zoukankan      html  css  js  c++  java
  • 【设计模式】解释器模式

    使用频率:★☆☆☆☆

    一、什么是解释器模式

    定义一些语法规则,然后定义一个解析器去解析该语法;

    二、补充说明

    该模式极少使用,简单了解下吧~

    三、角色(以加减法解析为例)

    抽象表达式类

    末端表达式类:数字变量

    非末端表达式:+-操作

    环境角色:存一些变量。。。

    客户端

    四、例子,JAVA实现

    参考维基百科例子

    一个解析加减法语法规则的例子

    抽象表达式类、以及末端表达式类和非末端表达式类

    package com.pichen.dp.behavioralpattern.interpreter;
    
    import java.util.Map;
    
    public interface Expression {
        public int interpret(Map<String, Expression> variables);
    }
    
    class Number implements Expression {
        private int number;
    
        public Number(int number) {
            this.number = number;
        }
    
        public int interpret(Map<String, Expression> variables) {
            return number;
        }
    }
    
    class Plus implements Expression {
        Expression leftOperand;
        Expression rightOperand;
    
        public Plus(Expression left, Expression right) {
            leftOperand = left;
            rightOperand = right;
        }
    
        public int interpret(Map<String, Expression> variables) {
            return leftOperand.interpret(variables) + rightOperand.interpret(variables);
        }
    }
    
    class Minus implements Expression {
        Expression leftOperand;
        Expression rightOperand;
    
        public Minus(Expression left, Expression right) {
            leftOperand = left;
            rightOperand = right;
        }
    
        public int interpret(Map<String, Expression> variables) {
            return leftOperand.interpret(variables) - rightOperand.interpret(variables);
        }
    }
    
    class Variable implements Expression {
        private String name;
    
        public Variable(String name) {
            this.name = name;
        }
    
        public int interpret(Map<String, Expression> variables) {
            if (null == variables.get(name))
                return 0; // Either return new Number(0).
            return variables.get(name).interpret(variables);
        }
    }
    package com.pichen.dp.behavioralpattern.interpreter;
    
    import java.util.Map;
    import java.util.Stack;
    
    public class Evaluator implements Expression {
        private Expression syntaxTree;
    
        public Evaluator(String expression) {
            Stack<Expression> expressionStack = new Stack<Expression>();
            for (String token : expression.split(" ")) {
                if (token.equals("+")) {
                    Expression subExpression = new Plus(expressionStack.pop(), expressionStack.pop());
                    expressionStack.push(subExpression);
                } else if (token.equals("-")) {
                    // it's necessary remove first the right operand from the stack
                    Expression right = expressionStack.pop();
                    // ..and after the left one
                    Expression left = expressionStack.pop();
                    Expression subExpression = new Minus(left, right);
                    expressionStack.push(subExpression);
                } else
                    expressionStack.push(new Variable(token));
            }
            syntaxTree = expressionStack.pop();
        }
    
        public int interpret(Map<String, Expression> context) {
            return syntaxTree.interpret(context);
        }
    }

    客户端角色,包含环境角色,直接写在main函数里面了

    package com.pichen.dp.behavioralpattern.interpreter;
    import java.util.Map;
    import java.util.HashMap;
    
    public class InterpreterExample {
        public static void main(String[] args) {
            String expression = "w x z - +";
            Evaluator sentence = new Evaluator(expression);
            Map<String,Expression> variables = new HashMap<String,Expression>();
            variables.put("w", new Number(5));
            variables.put("x", new Number(10));
            variables.put("z", new Number(42));
            int result = sentence.interpret(variables);
            System.out.println(result);
        }
    }

    结果打印:-27

  • 相关阅读:
    linq中的AsEnumerable()方法
    c# 一个匿名对象中包含多个子对象的处理方式
    jenkins的安装与启动
    牛客网-2018年湘潭大学程序设计竞赛-F
    poj-1149(最大流)
    hdu-2255(带权二分图)
    bzoj-1191(二分图最大匹配)
    codevs2822
    hdu 5652(并查集)
    hdu—3861(tarjan+二分图)
  • 原文地址:https://www.cnblogs.com/chenpi/p/5222496.html
Copyright © 2011-2022 走看看