行为型(十) - 解释器模式

news2024/12/26 10:50:26

一、概念

解释器模式(Interpreter Pattern):解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。实际应用中较少用到的行为模式。

二、实现

举个常见的面试题,输入这样一个字符串“6 3 5 7 - + * ”,中间空格隔开。前面是运算的数,后面是运算符。先取前两个数6 3,再取一个运算符-,6-3=3,然后用结果继续和后面的数进行计算3+5=8,8*7=56。下面是实现代码:
1、表达式

public interface Expression {
    long interpreter();
}

public class NumberExpression implements Expression{
    private long number;

    public NumberExpression(long number) {
        this.number = number;
    }

    public NumberExpression(String number) {
        this.number = Long.parseLong(number);
    }

    @Override
    public long interpreter() {
        return number;
    }
}

public class AddExpression implements Expression {
    private Expression exp1;
    private Expression exp2;

    public AddExpression(Expression exp1, Expression exp2) {
        this.exp1 = exp1;
        this.exp2 = exp2;
    }

    @Override
    public long interpreter() {
        return exp1.interpreter() + exp2.interpreter();
    }
}

public class SubstractionExpression implements Expression {
    private Expression exp1;
    private Expression exp2;

    public SubstractionExpression(Expression exp1, Expression exp2) {
        this.exp1 = exp1;
        this.exp2 = exp2;
    }

    @Override
    public long interpreter() {
        return exp1.interpreter() - exp2.interpreter();
    }
}

public class MultiplicationExpression implements Expression {
    private Expression exp1;
    private Expression exp2;

    public MultiplicationExpression(Expression exp1, Expression exp2) {
        this.exp1 = exp1;
        this.exp2 = exp2;
    }

    @Override
    public long interpreter() {
        return exp1.interpreter() * exp2.interpreter();
    }
}

public class DivisionExpression implements Expression {
    private Expression exp1;
    private Expression exp2;

    public DivisionExpression(Expression exp1, Expression exp2) {
        this.exp1 = exp1;
        this.exp2 = exp2;
    }

    @Override
    public long interpreter() {
        return exp1.interpreter() / exp2.interpreter();
    }
}

2、ExpressionInterpreter运算实现类

public class ExpressionInterpreter {
    private Deque<Expression> numbers = new LinkedList<>();

    public long interpreter(String expression) {
        String[] elements = expression.split(" ");
        Expression result = null;
        int lastNumIndex = (elements.length + 1) / 2;
        for (int i = 0; i < lastNumIndex; i++) {
            numbers.addLast(new NumberExpression(elements[i]));
        }
        for (int j = lastNumIndex; j < elements.length; j++) {
            Expression num1 = numbers.pollFirst();
            Expression num2 = numbers.pollFirst();
            
            switch (elements[j]) {
                case "+":
                    result = new AddExpression(num1, num2);
                    break;
                case "-":
                    result = new SubstractionExpression(num1, num2);
                    break;
                case "*":
                    result = new MultiplicationExpression(num1, num2);
                    break;
                case "/":
                    result = new DivisionExpression(num1, num2);
                    break;
        }
        long temp = result.interpreter();
        numbers.addFirst(new NumberExpression(temp));       
    }

    System.out.println("result: " + result.interpreter());
    return result.interpreter();
}

3、测试类

public class Client {
    public static void main(String[] args) {
        ExpressionInterpreter interpreter = new ExpressionInterpreter();
        interpreter.interpreter("6 3 5 7 - + *");
    }
}

4、运行结果
解释器模式结果.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/916689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v7.0版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持 UDP 、TCP 、WebSocket 三种协议&#xff0c;支持 iOS、Android、H5、标准Java、小程序、Uniapp&#xff0c;服务端基于Netty编写。 工程…

WebDAV之π-Disk派盘 + Cloud Player

Cloud Player云媒体播放器是存储在常见云平台中的内容的通用播放器,无需将其下载到设备。支持以下云平台:Google Drive、DropBox、One Drive、WebDav等。此外,在播放或查看文件时,您可以将其下载到本地设备中,以便在未连接到互联网时稍后进行检查。 π-Disk派盘 – 知识管…

Docker容器:docker-compose管理创建LNMP服务并运行Wordpress网站平台

文章目录 一&#xff0e;项目环境1. 环境描述2.项目需求 二&#xff0e;部署过程1.安装Docker2.安装Docker加速器3.Docker-Compose安装部署4.准备依赖文件、配置nginx5.配置mysql6.配置php7.编写docker-compose.yml8.验证 三.容器快照&#xff0c;然后将Docker镜像打包成tar包备…

快速上手Linux核心命令:网络相关命令

前言 这期呢主要说一说Linux中与网络相关命令&#xff0c;一共包含19个命令 测试主机之间网络是否联通 1、简介 ping 命令不管是在Windows还是Linux都是比较常用的命令。命令用于测试主机之间的网络连通性 2、语法格式 ping [参数选项] [目标主机] 3、参数说明 参数参数说明…

jsp 毕业生信息系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP毕业生信息系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&am…

【STM32RT-Thread零基础入门】 7. 线程创建应用(多线程运行机制)

硬件&#xff1a;STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 文章目录 前言一、RT-Thread相关接口函数1. 获取当前运行的线程2. 设置调度器钩子函数 二、程序设计1. 头文件包含及宏定义2. 线程入口函数定义3. main函数设…

【面试经典150题】合并两个有序数组-JavaScript版

题目来源 初始思路&#xff1a;同时循环遍历两个数组&#xff0c;选出较小元素放入新数组。剩下一个没有被遍历完的数组的剩余元素直接拼接到新数组后。 错误示例&#xff1a; var merge function (nums1, m, nums2, n) {let i 0,j 0,nums3 [];while (i < m &&am…

会计如何使用ChatGPT提高工作效率

文章目录 ChatGPT改变了会计行业微软重新定义了PC交互应对ChatGPT带来的冲击给财务人员的建议总结 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的个人社…

在Linux搭建GitLab私有仓库配置实现远程访问私有仓库Gitlab ——【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留…

人工智能AI时代:全栈程序员的人生规划

标题 人工智能AI时代&#xff1a;全栈程序员的人生规划1. AI时代的背景1.1 技术的快速发展1.2 全栈程序员面临的挑战 2. 全栈程序员的新技能要求2.1 机器学习与深度学习基础2.2 数据处理与分析2.3 云计算与边缘计算 3. 人生规划的建议3.1 持续学习3.2 拥抱变化3.3 寻找与AI结合…

Map和Set详解

一、二叉搜索树搜索树 1.二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都…

你见过最厉害的软件测试工程师是怎样的?

最厉害的测试工程师&#xff0c;可以在研发设计评审时发现潜在的bug&#xff0c;提出风险点&#xff0c;而不是等研发已经把代码写好了&#xff0c;部署完了&#xff0c;再用测试的方式去发现这个bug。举两个真实例子。 我们为上层业务提供算法算子&#xff0c;算子本身可能有…

shell 05(shell索引数组变量)

一、数组 shell 支持数组 (Array)&#xff0c;数组是若干数据的集合&#xff0c;其中的每一份数据都称为数组的元素. 注意Bash shell 只支持一维数组&#xff0c;不支持多维数组。 在 Shell 中&#xff0c;用括号( )来表示数组&#xff0c;数组元素之间用空格来分隔. 语法为&…

无涯教程-PHP - 常量数组

现在可以使用 define()函数定义数组常量。在PHP 5.6中&#xff0c;只能使用 const 关键字定义它们。 <?php//define a array using define functiondefine(animals, [dog,cat,bird]);print(animals[1]); ?> 它产生以下浏览器输出- cat PHP - 常量数组 - 无涯教程网无…

32、启用 HTTP 响应压缩和编程式配置Web应用

★ 启用HTTP压缩 就是前端页面如果改动的比较多&#xff0c;那么响应就会比较慢&#xff0c;可以通过设置HTTP响应压缩来提高响应&#xff0c;如果前端改动少&#xff0c;那么就不需要启动这个响应压缩。 目的&#xff1a;为了提高HTTP响应数据在网络上的传输效率。▲ 设置如…

UE学习记录03----UE5.2 使用MVVM示例

1.打开ue5.2新建C项目 2.项目中通过类导向新建C类&#xff0c;父类选择为UMVVMViewModelBase&#xff0c;创建完成会自动打开vs 3.在VS中对新建的类进行宏定义 使用 C 类向导 创建的类声明自动通过 UCLASS() 宏进行处理。 UCLASS() 宏使得引擎意识到这个类的存在&#xff0c;并…

opencv进阶19-基于opencv 决策树cv::ml::DTrees 实现demo示例

opencv 中创建决策树 cv::ml::DTrees类表示单个决策树或决策树集合&#xff0c;它是RTrees和 Boost的基类。 CART是二叉树&#xff0c;可用于分类或回归。对于分类&#xff0c;每个叶子节点都 标有类标签&#xff0c;多个叶子节点可能具有相同的标签。对于回归&#xff0c;每…

基于matlab的lorenz混沌系统仿真与分析

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..................................................................................... l…

控制台实现家庭记账本功能

需求&#xff1a; 在控制台实现家庭记账本的小功能&#xff0c;功能如下 参考代码如下&#xff1a; import java.util.Scanner;/*** <p>家庭账本-综合案例</p>** author 波波老师(weixin : javabobo0513)*/ public class Demo24 {public static void main(Strin…

虚拟机密码忘了如何解决?

很久以前使用过的虚拟机&#xff0c;因为太久时间没有密码忘了&#xff0c;在网上查询了一种好的方法进行解决&#xff0c;写篇博客记录一下&#xff01;&#xff01;&#xff01; 打开虚拟机&#xff0c;让虚拟机启动 启动中疯狂按Esc&#xff0c;使得页面出现下图&#xff1…