• 设计模式之解释器模式


    定义

    解释器模式(Interpreter Pattern)是一种行为设计模式,它提供了一种方式来表示语言或表达式的语法,并定义了如何解释这些表达式来执行特定任务。这种模式常用于小型语言或简单的表达式解析,例如配置文件、SQL查询构建器或者计算表达式等。
    解释器模式的关键组件包括:

    • Expression(表达式): 抽象表达式接口,定义了一个interpret方法,用于解释表达式。
    • AbstractExpression(抽象表达式): 为所有具体表达式提供一个公共接口,通常包含interpret方法的实现。
    • TerminalExpression(终结符表达式): 实现与语言中的原子元素对应的解释行为。
    • NonTerminalExpression(非终结符表达式): 处理更复杂的语言结构,通常由其他表达式组成。
    • Context(上下文): 提供了环境信息,解释器需要从上下文中获取数据或向其写入数据。

    示例代码

    public interface Expression {
        int interpreter(Map<String, Integer> variables);
    }
    
    public abstract class AbstractExpression implements Expression {
        protected Expression left;
        protected Expression right;
    
        public AbstractExpression(Expression left, Expression right) {
            this.left = left;
            this.right = right;
        }
    }
    
    public class AddExpression extends AbstractExpression {
        public AddExpression(Expression left, Expression right) {
            super(left, right);
        }
    
        @Override
        public int interpreter(Map<String, Integer> variables) {
            return super.left.interpreter(variables) + super.right.interpreter(variables);
        }
    }
    
    public class SubExpression extends AbstractExpression {
        public SubExpression(Expression left, Expression right) {
            super(left, right);
        }
    
        @Override
        public int interpreter(Map<String, Integer> variables) {
            return super.left.interpreter(variables) - super.right.interpreter(variables);
        }
    }
    
    public class VarExpression implements Expression {
        private String key;
    
        public VarExpression(String key) {
            this.key = key;
        }
    
        @Override
        public int interpreter(Map<String, Integer> variables) {
            return variables.get(key);
        }
    }
    
    public class Calculator {
        private Expression expression;
    
        public Calculator(String expStr) {
            Stack<Expression> stack = new Stack<>();
            char[] charArray = expStr.toCharArray();
            Expression left;
            Expression right;
            for (int i = 0; i < charArray.length; i++) {
                switch (charArray[i]) {
                    case '+':
                        left = stack.pop();
                        right = new VarExpression(String.valueOf(charArray[++i]));
                        stack.push(new AddExpression(left, right));
                        break;
                    case '-':
                        left = stack.pop();
                        right = new VarExpression(String.valueOf(charArray[++i]));
                        stack.push(new SubExpression(left, right));
                        break;
                    default:
                        stack.push(new VarExpression(String.valueOf(charArray[i])));
                }
            }
            this.expression = stack.pop();
        }
    
        public int run(Map<String, Integer> variables) {
            return this.expression.interpreter(variables);
        }
    }
    

    源码地址

    https://gitee.com/youxiaxiaomage/java-practices/tree/master/yxxmg-gof-sample/src/main/java/com/yxxmg/gof/behavior/interpreter

  • 相关阅读:
    C语言——指针(入门详解)
    c# .NET 高级编程 高并发必备技巧 - 锁
    计算机毕业设计选什么题目好?springboot 健身房管理系统
    js使用canvas实现图片鼠标滚轮放大缩小拖拽预览,显示像素坐标,显示像素值
    Linux·驱动
    成都欢乐谷奇幻夜活动直播顺利开播,创意云激发文旅市场新活力
    使用Python插入100万条数据到MySQL数据库并将数据逐步写出到多个Excel
    vue3+ts+vite搭建脚手架(二)配置eslint&prettier
    AI学习指南数学工具篇-梯度下降算法之随机梯度下降(Stochastic Gradient Descent)
    蓝桥杯练习
  • 原文地址:https://blog.csdn.net/youxiaxiaomage/article/details/139385230