详解设计模式:解释器模式

news2024/9/22 4:13:18

解释器模式(interpreter pattern),是在 GoF 23 种设计模式中定义了的行为型模式。

解释器模式 这种模式被用在 SQL 解析、符号处理引擎等。

解释器模式 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。

本篇文章内容包括:关于解释器模式、解释器模式 Demo(伪代码)


文章目录

    • 一、关于解释器模式
        • 1、关于解释器模式
        • 2、关于解释器模式的构成
        • 3、关于解释其模式的UML
        • 4、关于访问者模式的适用场景
        • 5、关于访问者模式的优缺点
    • 二、解释器模式 Demo(伪代码)
        • 1、伪代码 Demo 实现
        • 2、Demo 测试


一、关于解释器模式

1、关于解释器模式

解释器模式(interpreter pattern),是在 GoF 23 种设计模式中定义了的行为型模式。

解释器模式 这种模式被用在 SQL 解析、符号处理引擎等。

解释器模式 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。

2、关于解释器模式的构成

解释器模式包含以下主要 5 种角色。

  • 抽象表达式(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
  • 终结符表达式(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。
  • 非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
  • 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

3、关于解释其模式的UML

image-20221204212444708

4、关于访问者模式的适用场景

解释器模式在实际的软件开发中使用比较少,因为它会引起效率、性能以及维护等问题。

在 Jdk 中的正则表达式中的 Pattern 类和 Spring 里面的 ExpressionParse 接口使用的是解释器模式的思想。

当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树的时候,如 XML 文档解释,整体来说还是一种应用较少的设计模式。

5、关于访问者模式的优缺点

# 访问者模式优点

  • 访问者模式增加新的操作很容易,只需要增加一个新的访问者即可;
  • 相关的行为,封装到一个访问者中;

# 访问者模式缺点

  • 增加新数据结构比较困难;
  • 元素变更比较困难,如为被访问的对象增加/减少一些属性,相应的访问者也需要进行修改。

二、解释器模式 Demo(伪代码)

1、伪代码 Demo 实现

# AbstractExpression 抽象表达式(Abstract Expression)角色

public abstract class AbstractExpression {

    /**
     * 解释方法
     * @param info String
     * @return boolean
     */
    public abstract boolean interpret(String info);
}

# NonTerminalExpression 非终结符表达式(Nonterminal Expression)角色

public class NonTerminalExpression extends AbstractExpression {

    private AbstractExpression address = null;
    private AbstractExpression name = null;
    private AbstractExpression id = null;

    public NonTerminalExpression(AbstractExpression address, AbstractExpression name, AbstractExpression id) {
        this.address = address;
        this.name = name;
        this.id = id;
    }

    @Override
    public boolean interpret(String info) {
        String[] strings = info.split("-");
        return address.interpret(strings[0]) && name.interpret(strings[1]) && id.interpret(strings[2]);
    }
}

# TerminalExpression 终结符表达式(Terminal Expression)角色

import java.util.HashSet;
import java.util.Set;

public class TerminalExpression extends AbstractExpression {

    private final Set<String> set = new HashSet<String>();

    public TerminalExpression(String[] data) {
        for (int i = 0; i < data.length; i++)
            set.add(data[i]);
    }


    @Override
    public boolean interpret(String info) {
        if (set.contains(info)) {
            return true;
        }
        return false;
    }
}

# Context 环境(Context)角色

public class Context {

    private final AbstractExpression information;

    public Context() {
        String[] number1 = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
        AbstractExpression number = new TerminalExpression(number1);
        String[] xxZm1 = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"};
        AbstractExpression xxZm = new TerminalExpression(xxZm1);
        String[] dxZm1 = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"};
        AbstractExpression dxZm = new TerminalExpression(dxZm1);
        information = new NonTerminalExpression(number, xxZm, dxZm);
    }

    public void interpreter(String info) {
        boolean ok = information.interpret(info);
        if (ok) {
            System.out.println("正确! [" + info + "] 满足  [单个数字-单个小写-单个大写]  的条件");
        } else {
            System.out.println("错误! [" + info + "] 不满足  [单个数字-单个小写-单个大写]  的条件");
        }
    }

}

2、Demo 测试

public class Client {
    
    public static void main(String[] args) {
        Context people = new Context();
        people.interpreter("2-a-A");
        people.interpreter("11-A-5");
        people.interpreter("你-好-吖");
        people.interpreter("2aA");
    }
}

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

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

相关文章

HTTP状态码是什么?

文章目录HTTP状态码1. 消息&#xff1a;1xx2. 成功&#xff1a;2xx3. 重定向&#xff1a;3xx4. 请求错误&#xff1a;4xx5. 服务器错误&#xff1a;5xxHTTP状态码 HTTP 状态码&#xff08;HTTP Status Code&#xff09;是一个表示服务器响应状态的 3 位整数代码。比如当服务器…

[Database] 关系型数据库中的MVCC是什么?怎么理解?原理是什么?MySQL是如何实现的?

文章目录前言并发控制并发控制的实现与锁的本质MVCC是什么&#xff1f;MVCC的多版本&#xff08;Multi-Version&#xff09;指的是什么&#xff1f;MVCC的实现方式&#xff1f;MySQL的实现PostgreSQL的实现结语前言 在并发场景下&#xff0c;如果我们不对数据做保护&#xff0c…

分布式文件存储系统FastDFS[1]-介绍以及安装

一、分布式文件存储 1.分布式文件存储的由来 在我们的项目中有很多需要存储的内容出现&#xff0c;比如图片&#xff0c;视频&#xff0c;文件等等&#xff0c;在早期的时候用户量不大&#xff0c;产生的文件也不是很多&#xff0c;这时我们可以把文件和服务程序放在一个服务器…

STAAD.Pro CONNECT Edition

STAAD.Pro CONNECT Edition Bentley STAAD或STAAD Pro软件是分析和设计世界第三世界的第一款最佳工程软件&#xff0c;对于金属、混凝土、木材、铝和冷金属的专业选择&#xff0c;设计几乎所有类型的塑料、石化、隧道、桥梁、蜡烛等结构专业的功能和软件中任何数据大小的使用。…

Java课程案例学习(3)

2.1 学生管理系统实现步骤 案例需求 针对目前我们的所学内容&#xff0c;完成一个综合案例&#xff1a;学生管理系统&#xff01;该系统主要功能如下&#xff1a; 添加学生&#xff1a;通过键盘录入学生信息&#xff0c;添加到集合中 删除学生&#xff1a;通过键盘录入要删…

Jcmd 虚拟机诊断利器

Jcmd 虚拟机诊断利器 Java虚拟机&#xff08;JVM&#xff09;是运行Java程序的抽象化的计算器。今天&#xff0c;来学习下如何轻松诊断正在运行的JVM。 JDK本身中提供了许多可用的工具&#xff0c;可以用于各种开发、监视和故障排除活动。推荐使用jcmd&#xff0c;简单易懂&a…

[附源码]计算机毕业设计南通大学福利发放管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

ThinkPHP6综合业务管理系统

有需要请私信或看评论链接哦 可远程调试 ThinkPHP6综合业务管理系统一 介绍 综合业务管理系统基于ThinkPHP6开发&#xff0c;数据库mysql&#xff0c;前端Layui&#xff0c;后台模板ok-admin。管理员登录系统后可对场所&#xff0c;分类&#xff0c;用户&#xff0c;运营商&am…

图片扫描仪第一弹,我实现了一个办公位简笔画

来一波对比 其实我工位还有点手办&#xff0c;一个植物&#xff0c;实在不会画&#xff0c;于是画了个基础版的。 办公位简笔画 虽然&#xff0c;这个工位上没有一个动画&#xff0c;但是图形和实物神似&#xff0c;所以可以用另一个动总结这个简笔画&#xff0c;那就是生动…

量子计算(十一):常见逻辑门以及含义

文章目录 常见逻辑门以及含义 一、Hadamard&#xff08;H&#xff09;门 二、Pauli-X 门 三、Pauli-Y 门 四、Pauli-Z 门 五、旋转门&#xff08;rotation operators&#xff09; 1、RX&#xff08;θ&#xff09;门 2、RY&#xff08;θ&#xff09;门 3、RZ&#xf…

深入理解计算机系统

hi&#xff0c;大家好&#xff0c;我是大师兄&#xff0c;让我们一起复习了一遍计算机系统核心知识&#xff0c;希望大家早日掌握这些核心知识&#xff0c;打造自己坚实的基础&#xff0c;为自己目标慢慢积累&#xff0c;等到自己春天的到来。详细点击查看-> 极客星球。计算…

PDF解除密码怎么操作?教你一键解除密码

我们在处理工作文件时&#xff0c;经常会有一些文件是加密状态的&#xff0c;这种文件必须要输入密码才可以打开&#xff0c;这时候就造成了很多不便&#xff0c;如果文件需要打印&#xff0c;我们就必须先输入密码&#xff0c;而且在每次查看文件前&#xff0c;都必须输入密码…

记录一次 在linux 搭建的mysql迁移到docker容器中

上篇文章写道&#xff0c;我腾讯云被攻击了&#xff0c;然后我各种删除木马文件&#xff0c;但在这个过程中&#xff0c;有些系统文件没认到&#xff0c;以为是木马文件&#xff0c;就删除了&#xff0c;各种处理无果&#xff0c;打开腾讯云的救援模式&#xff0c;备份了些重要…

【数据库】mysql索引

DB索引&#xff1a; 如果表创建了索引&#xff0c;那么DB会维护一张关于索引和主键关系的表 好处&#xff1a;快速查找数据 缺点&#xff1a;要额外维护一张表&#xff0c;会额外占用空间&#xff0c;对于表数据的更新操作都涉及更新索引 索引的操作 创建索引&#xff1a;…

LeetCode 74. 搜索二维矩阵

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 74. 搜索二维矩阵&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode 74.…

[Android] [ROOT] Magisk(魔术师/面具) 设置以及必装模块的安装

&#x1f341;简介 当我们给手机刷入Magisk(面具)后&#xff0c;等于获得了安卓系统的最高管理员权限&#xff0c;也就是root权限。获取root权限后的设备相对于未root的设备&#xff0c;安全性会有一定的降低。也许是基于这个原因&#xff0c;现在大部分应用都会检测你的设备是…

xcode常用功能与操作

查看target是静态还是动态库 选中target&#xff0c;点击Build Settings tag&#xff0c;然后再右上角搜索框输入 mach&#xff0c;查看Mach-O type的值即可 mach-o文件类型分为&#xff1a; Executable&#xff1a;应用的主要二进制 Dylib Library&#xff1a;动态链接库&am…

栈与队列5:逆波兰表达式求值

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;150. 逆波兰表达式求值 题目&#xff1a; 根据 逆波兰表示法&#xff0c;求表达式的值。 有效的算符包括 、-、*、…

安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】

&#x1f495;&#x1f495;&#x1f495;&#x1f495;&#x1f495;&#x1f495;&#x1f495;&#x1f495;&#x1f495;&#x1f495;&#x1f495;提取手机分区方法列举&#x1f495;&#x1f495;&#x1f495;&#x1f495;&#x1f495;&#x1f495;&#x1f495;&a…

mybatis-plus,sgg,杨bochao,p49完成

MyBatis-Plus (baomidou.com) 一 MyBatis-Plus简介 增强工具。只做增强不做改。 可以直接在mybatis的基础上整合mybatis-plus。此时并不会影响mybatis的功能&#xff0c;即mybatis原来的功能都在&#xff0c;该怎么用还怎么用。锦上添花的是还能使用mybatis-plus提供的&#…