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

     * 解释模式:用得极其少:此处用一个加法和乘法例子说明:
     * 模式特点:一个表达式接口(Expression)和多个实现类,表达式接口有个解释的方法interpret();
     * 表达式接口的实现类分成2类: 非终结符表达式(NonterminalExpression),例如 加号就是非总结表达式,因为是一个过程
     * 终结符表达式(TerminalExpression):就是能取到具体指的表达表达式,如 5这个数字就是终结表达式,因为它不是一个过程
     * Context:上下文,用于存储终结表达式的值
     * 本例模拟实现加法和乘法的过程
     */
    
    //抽象解释器(AbstractExpression)
    public interface Expression {
        int interpret(Context context);
    }
    //终结表达式,获取具体值
    public class NumberExpression implements Expression{
        private String name;
    
        public NumberExpression(String name) {
            this.name = name;
        }
        //通过名字在上下文获取具体的值
        @Override
        public int interpret(Context context) {
            return context.interpret(name);
        }
    }
    //非终结符表达式(NonterminalExpression) 乘法
    public class MultipyEpression implements Expression{
        private Expression e1,e2; //e1,e2都是终结表达式
    
        public MultipyEpression(Expression e1, Expression e2) {
            this.e1 = e1;
            this.e2 = e2;
        }
    
        @Override
        public int interpret(Context context) {
            //乘法运算
            return this.e1.interpret(context)*this.e2.interpret(context);
        }
    }
    //非终结符表达式(NonterminalExpression) 加法
    public class AddExpression implements Expression {
        private Expression e1,e2; //e1,e2都是终结表达式
    
        public AddExpression(Expression e1, Expression e2) {
            this.e1 = e1;
            this.e2 = e2;
        }
    
        @Override
        public int interpret(Context context) {
            //加法运算
            return this.e1.interpret(context)+this.e2.interpret(context);
        }
    }
    //上下文表达式
    public class Context {
        private Map<String,Integer> map=new HashMap<>();
        //存储终结表达式的值
        public void addNum(String name,Integer num){
            if(null==map.get(name)){
                map.put(name,num);
            }
        }
        //获取终结表达式的值
        public int interpret(String name){
            return map.get(name);
        }
    }
    public class Test {
        public static void main(String[] args) {
            Context context = new Context();//上下文对象
            Expression e1 = new NumberExpression("e1"); //终结表达式
            Expression e2 = new NumberExpression("e2");//终结表达式
            Expression e3 = new NumberExpression("e3");//终结表达式
            context.addNum("e1",2);//给终结表达式 赋值
            context.addNum("e2",6);//给终结表达式 赋值
            context.addNum("e3",3);//给终结表达式 赋值
            //计算(2+6)*3
            MultipyEpression multipyEpression = new MultipyEpression(new AddExpression(e1, e2), e3);
            System.out.println(multipyEpression.interpret(context));//24
        }
    }
  • 相关阅读:
    layer 弹出在 iframe内部弹出不居中是原因
    关于 DropDownList 循环绑定中遇到的问题
    C# Oracle insert 过程中出现中文乱码问题
    使用C#实现sql server 2005 和Oracle 数据同步
    C# mysql 数据库操作模板
    spring jar 包详解、依赖说明
    在js中使用jstl标签给js变量赋值
    maven3 在创建web项目时:Dynamic Web Module 3.0 requires Java 1.6 or newer 错误
    hadoop start-all.sh 启动出错java.lang.ClassNotFoundException: start-all.sh
    jquery easyui datagrid 排序
  • 原文地址:https://www.cnblogs.com/yangxiaohui227/p/10945268.html
Copyright © 2011-2022 走看看