zoukankan      html  css  js  c++  java
  • 解释器模式

    public abstract class Expression {
    
        /* 解析公式和数值。当中var中的key值是公式中的參数,value值是详细的数字  */
        public abstract int interpreter(HashMap<String, Integer> var);
    
    }

    public abstract class SymbolExpression extends Expression{
    
        protected Expression left;
        protected Expression right;
    
        /* 全部的解析公式都应仅仅关心自己左右两个表达式的结果 */
        public SymbolExpression(Expression _left,Expression _right){
            this.left = _left;
            this.right= _right;
        }
    
    }

    /**
     * 减法解析器
     * @author Administrator
     */
    public class SubExpression extends SymbolExpression{
    
        public SubExpression(Expression _left, Expression _right) {
            super(_left, _right);
        }
    
        /* 左右两个表达式相减 */
        public int interpreter(HashMap<String, Integer> var) {
            return super.left.interpreter(var) - super.right.interpreter(var);
        }
    
    }

    /**
     *
     * 加法解析器
     * @author Administrator
     */
    public class AddExpression extends SymbolExpression{
    
        public AddExpression(Expression _left,Expression _right){
            super(_left, _right);
        }
    
        /* 把左右两个表达式运算的结果加起来  */
        public int interpreter(HashMap<String, Integer> var) {
            return super.left.interpreter(var) + super.right.interpreter(var);
        }
    }

    /**
     * 封装解析器
     * @author Administrator
     */
    public class Calculator {
        /* 定义的表达式 */
        private Expression expression;
    
        /* 构造函数传參,并解析 */
        public Calculator(String expStr){
            /* 定义一个堆栈,安排运算的先后顺序 */
            Stack<Expression> stack = new Stack<Expression>();
    
            char[] charArray = expStr.toCharArray();
    
            Expression left = null;
            Expression right= null;
    
            for(int i=0; i<charArray.length; i++){
                switch (charArray[i]) {
                case '+' : //加法
                    /* 加法结果放到堆栈中 */
                    left = stack.pop();
                    right = new TerminalExpression(String.valueOf(charArray[++i]));
                    stack.push(new AddExpression(left, right));
                    break;
                case '-' : //加法
                    left = stack.pop();
                    right =  new TerminalExpression(String.valueOf(charArray[++i]));
                    stack.push(new SubExpression(left, right));
                    break;
                default: //公式中的变量
                    stack.push(new TerminalExpression(String.valueOf(charArray[i])));
                    break;
                }
            }
            /* 把运算结果抛出来  */
            this.expression = stack.pop();
        }
        /**
         * 開始运算
         * @param var
         */
        public int run(HashMap<String, Integer> var){
            return this.expression.interpreter(var);
        }
    }

    public class TerminalExpression extends Expression{
    
        private String key;
    
        public TerminalExpression(String _key){
            this.key = _key;
        }
    
        /* 通常终结符表达式仅仅有一个,可是有多个对象 */
        public int interpreter(HashMap<String, Integer> var) {
            return var.get(this.key);
        }
    
    }

    /**
     * 解释器模式
     * @author Administrator
     */
    public class Client {
        public static void main(String[] args) throws IOException{
            //执行四则运算
            String expStr = getExpStr();
            //赋值
            HashMap<String, Integer> var = getValue(expStr);
            Calculator cal = new Calculator(expStr);
            System.out.println("运算结果为:"+expStr +"=" + cal.run(var));
        }
    
        /* 获得表达式 */
        public static String getExpStr() throws IOException{
            System.out.println("请输入表达式:");
            return (new BufferedReader(new InputStreamReader(System.in))).readLine();
        }
    
        /* 获得值映射  */
        public static HashMap<String, Integer> getValue(String expStr) throws IOException{
            HashMap<String, Integer> map = new HashMap<String, Integer>();
            for(char ch : expStr.toCharArray()){
                if(ch != '+' && ch != '-'){
                    /* 解决反复參数的问题 */
                    if(!map.containsKey(String.valueOf(ch))){
                        System.out.println("请输入 "+ch+" 的值:");
                        String in = (new BufferedReader(new InputStreamReader(System.in))).readLine();
                        map.put(String.valueOf(ch), Integer.valueOf(in));
                    }
                }
            }
            return map;
        }
    }

    
    执行结果:
    
    请输入表达式:
    a+b-c
    请输入 a 的值:
    100
    请输入 b 的值:
    2
    请输入 c 的值:
    101
    运算结果为:a+b-c=1
  • 相关阅读:
    Ubuntu14.04安装一个小问题,搜狗输入法
    HDU 2612 -Find a way (注重细节BFS)
    cmd介面,进adb命令提示符error
    软件开发V型号
    采用tcpdump攫Android网络数据包
    Effective C++ 18-23
    ExtJS得知--------Ext.Element学习的查询方法(示例)
    基OOP知识
    Openfire开发配置,Openfire源码配置,OpenFire二次开发配置
    真正菜鸟用教程之WQSG Scrip Export WQSG (脚本导出导入工具,PSP、NDS汉化必备 )
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7183696.html
Copyright © 2011-2022 走看看