【行为型模式】解释器模式

一、解释器模式概述

        解释器模式定义给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。(类行为型)

  • 解释器模式的优缺点
    • 优点
      • 1.将每一个语法规则表示成一个类,方便于实现语言;
      • 2.因为语法由许多类表示,所以你可以轻易地改变或扩展此语言;
      • 3.通过在类结构中加入新的方法,可以在解释的同时增加新的行为,例如打印格式的美化或者进行复杂的程序验证。
    • 缺点
      • 当语法规则的数目太大时,这个模式可能会变得非常繁杂。在这种情况下,使用解析器/编译器的产生器可能更合适。
  • 适用场景
    • 1.当你需要实现一个简单的语言时,使用解释器;
    • 2.当你有一个简单的语法,而且简单比效率更重要时,使用解释器;
    • 3.可以处理脚本语言和编程语言。

解释器模式与适配器模式这两个模式类似 , 但是略有不同:

  • 适配器模式 : 不需要预先知道适配器的规则;
  • 解释器模式 : 需要预先将规则写好 , 根据规则执行解释。

二、代码实现

        解释器模式主要角色如下:

  • 抽象表达式(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
  • 终结符表达式(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。
  • 非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
  • 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。
  • 客户端(Client):主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,当然也可以通过环境角色间接访问解释器的解释方法。

用解释器模式设计一个“韶粵通”公交车卡的读卡器程序。

说明:假如“韶粵通”公交车读卡器可以判断乘客的身份,如果是“韶关”或者“广州”的“老人” “妇女”“儿童”就可以免费乘车,其他人员乘车一次扣 2 元。

文法规则如下:
<expression> ::= <city>的<person>
<city> ::= 韶关|广州
<person> ::= 老人|妇女|儿童
        2.1 抽象表达式(IExpression)
package interpreter.buscard;
//抽象表达式类
public interface IExpression{public boolean interpret(String info);
}
        2.2 终结符表达式(TerminalExp)
package interpreter.buscard;
import java.util.HashSet;
import java.util.Set;
//终结符表达式类
public class TerminalExp implements IExpression {private Set<String> set = new HashSet<>();public TerminalExp(String[] data) {for (int i = 0; i < data.length; i++){set.add(data[i]);}}@Overridepublic boolean interpret(String info) {// TODO Auto-generated method stubif (set.contains(info)){return true;}return false;}}
        2.3 非终结符表达式(AndExpression)
package interpreter.buscard;
//非终结符表达式类
public class AndExpression implements IExpression {private IExpression city = null;private IExpression person = null;public AndExpression(IExpression city, IExpression person) {this.city = city;this.person = person;}@Overridepublic boolean interpret(String info) {// TODO Auto-generated method stubString[] s = info.split("的");return city.interpret(s[0]) && person.interpret(s[1]);}}
        2.4 环境(context)
package interpreter.buscard;
//环境类
public class Context {private String[] cities = {"韶关","广州"};private String[] persons = {"老人","妇女","儿童"};private IExpression cityPerson;public Context() {IExpression city = new TerminalExp(cities);IExpression person = new TerminalExp(persons);cityPerson = new AndExpression(city,person);}public void freeRide(String info){boolean ok = cityPerson.interpret(info);if (ok){System.out.println("您是"+info+",您本次乘车免费!");}else {System.out.println(info+",您不是免费人员,本次乘车扣费2元!");}}
}
        2.5 客户端(Test)
package interpreter.buscard;public class Test {public static void main(String[] args) {// TODO Auto-generated method stubContext bus = new Context();bus.freeRide("韶关的老人");bus.freeRide("韶关的年轻人");bus.freeRide("广州的妇女");bus.freeRide("广州的儿童");bus.freeRide("山东的儿童");}}
        2.6 UML图

三、代码结构图

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

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

相关文章

python高级进阶

目录 一、str字符串 1. 字符串定义 2. 获取字符串中元素 3. 遍历字符串 4. 字符串常见操作 二、set集合 1. 集合的创建 2. 遍历集合中的元素 3. 集合中添加元素 4. 集合删除元素 三、字典 1. 字典的定义 2. 字典的特点 3. 字典增删改查 4. 字典遍历 四、slice切片…

【经验总结】Ubuntu 源代码方式安装 Microsoft DeepSpeed

1. 背景介绍 使用 DeepSpeed 在多服务器上分布式训练大模型 2. 安装方法 2.1 查看显卡参数 ~$ CUDA_VISIBLE_DEVICES0 python -c "import torch; print(torch.cuda.get_device_capability())" (8, 0) ~$ CUDA_VISIBLE_DEVICES0 python -c "import torch; pr…

python常见语法

变量赋值&#xff1a; my_var 10 基本数据类型&#xff1a; 整数&#xff08;int&#xff09;、浮点数&#xff08;float&#xff09;、字符串&#xff08;str&#xff09;、布尔值&#xff08;bool&#xff09;、列表&#xff08;list&#xff09;、元组&#xff08;tuple&…

代码随想录第三十天|无重叠区间| 划分字母区间| 合并区间

今天三道都是重叠区间问题&#xff0c;重叠区间问题第一步就是先对数组进行排序&#xff0c;才能进行后续操作。 无重叠区间 这一题和昨天的最少多少支箭射爆气球的解法是相同的&#xff0c;判断相邻区间是否重叠&#xff0c;若两个区间重叠了则找出重叠区间最小右边界&#…

怎样用PHP语言实现远程控制三路开关

怎样用PHP语言实现远程控制三路开关呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制三路开关&#xff0c;三路开关可控制三路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能WiFi墙…

C++:模板(初级)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;模板&#xff08;初级&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞…

Docker容器搭建Hadoop集群(hadoop-3.1.3)

Docker容器环境下搭建Hadoop集群&#xff08;完全分布式&#xff09; hadoop版本为hadoop-3.1.3 &#xff08;1&#xff09;安装额外的速度较快的镜像库 yum install -y epel-release &#xff08;2&#xff09;安装同步工具&#xff0c;方便在多台服务器上进行文件的传输 …

Oracle Hint 语法详解

什么是Hint Hint 是 Oracle 提供的一种 SQL 语法&#xff0c;它允许用户在 SQL 语句中插入相关的语法&#xff0c;从而影响 SQL 的执行方式。 因为 Hint 的特殊作用&#xff0c;所以对于开发人员不应该在代码中使用它&#xff0c;Hint 更像是 Oracle 提供给 DBA 用来分析诊断问…

从零学算法377

377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3], target 4 输出&#xff…

【操作系统】进程同步(水果盘问题)使用Python多线程threading实现

一、进程同步&#xff08;水果盘问题&#xff09; 1、吃水果问题&#xff1a;桌子有一只盘子&#xff0c;只允许放一个水果&#xff0c;父亲专向盘子放苹果&#xff0c;母亲专向盘子放桔子 儿子专等吃盘子的桔子&#xff0c;女儿专等吃盘子的苹果。只要盘子为空&#xff0c;父…

QA测试开发工程师面试题满分问答20: 软件的安全性应从哪几个方面去测试?

软件的安全性测试应从多个方面进行&#xff0c;并确保覆盖以下关键方面&#xff1a; 当回答问题时&#xff0c;可以根据自己的经验和知识&#xff0c;从上述要点中选择适合的方面进行详细说明。强调测试的综合性、全面性和持续性&#xff0c;并强调测试的重要性以及如何与开发团…

IDEA最好用插件推荐

1 背景 俗话说&#xff1a;“工欲善其事必先利其器”&#xff0c;本问介绍几款强大实用的 IDEA 插件&#xff0c;助力大家开发。 希望大家做一个聪明又努力的人&#xff0c;而不只是一个努力的人。 以下插件大都可以通过 IDEA 自带的插件管理中心安装&#xff0c;如果搜不到可以…

python字典和集合

字典&#xff08;Dictionary&#xff09; 键值对&#xff1a;字典存储键值对&#xff08;key-value pairs&#xff09;&#xff0c;其中键&#xff08;key&#xff09;是唯一的&#xff0c;而值&#xff08;value&#xff09;可以是任何数据类型。可变&#xff1a;字典是可变的…

恶补《操作系统》2_1——王道学习笔记

2操作系统-进程 2.1_1 进程的定义、组成、组织方式、特征 组成&#xff1a;PCB&#xff08;进程存在唯一的标志&#xff09;&#xff0c;程序段&#xff0c;数据段 组织方式&#xff1a;链接方式&#xff0c;指针指向不同的队列&#xff1b;索引方式&#xff0c;索引表 特征…

Uptime Kuma 使用指南:一款简单易用的站点监控工具

我平时的工作会涉及到监控&#xff0c;而站点是一个很重要的监控项。项目上线后&#xff0c;我们通常会将站点监控配置到云平台上&#xff0c;以检测各站点的连通性。但随着项目不断增多&#xff0c;云平台上的配额就有点捉急了。针对这个情况&#xff0c;我们可以试试这个开源…

使用H5+app在安卓5.1离线环境实现文字转语音

在Vue中实现中文文字转语音的方法可以使用HTML5的SpeechSynthesis API,同时需要考虑到在H5+ App里面的离线环境。 在配置文件中正确引入plus库: <script src="http://www.dcloud.io/helloh5plus/api.js"></script> 在Vue组件中使用SpeechSynthesi…

设计模式——状态模式19

状态模式是一种行为设计模式&#xff0c; 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来好像修改了它的类。状态模式的核心是状态与行为绑定&#xff0c;不同的状态对应不同的行为。 设计模式&#xff0c;一定要敲代码理解 状态行为抽象 //在某种状态下&…

【网安小白成长之路】9.sql注入操作

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

SpringBoot整合七牛云实现图片的上传管理

唠嗑部分 各位小伙伴大家好&#xff0c;我是全栈小白&#xff0c;今天我们来分享一下SpringBoot如何整合七牛云存储实现图片的上传与存储 首先我们来说说图片存储&#xff0c;在项目中图片几乎是必不可少的&#xff0c;那么大家会选择怎样存储呢&#xff0c;当然有几种方案 …

XiaodiSec day027 Learn Note 小迪安全学习笔记

XiaodiSec day027 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 27day 还是 sql 知识点 数据类型注入&#xff1a; 数字型&#xff0c;字符型&#xff0c;搜索型&#xff0c;加密型 开始 数字型 数字型是 0-9 字符型 字符型是 a-z 等 在接收 sql …