首页 > 其他分享 >设计模式之解释器模式

设计模式之解释器模式

时间:2022-09-06 15:55:52浏览次数:99  
标签:解释器 终结符 模式 设计模式 public AbstractExpression

解释器模式字面意思,也即解释某些内容的含义。这种设计模式是实际开发中最不容易用到的。比如SQL解析,符号处理引擎,会用到解释器模式,属于更底层的开发人员才会用到的设计模式。

本文就以解释器模式的概念、角色和简单的例子说明解释器模式,读者对这部分内容了解即可。

一、概念

解释器模式是指给定一门语言,定义它的文法的一种表示(如:加减乘除表达式和正则表达式等),然后再定义一个解释器,该解释器用来解释我们的文法表示(表达式)。

解释器模式的结构与组合模式相似,不过其包含的组成元素比组合模式多,而且组合模式是对象结构型模式,而解释器模式是类行为型模式。

解释器模式中包含四个角色:

  1. 抽象解释器(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。

  2. 终结符解释器(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。

  3. 非终结符解释器(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。

  4. 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

    解释器模式类结构图如图所示:

image-20220906145121375

二、实现

接下来针对四个角色分别定义他们的实现。

抽象解释器:

/**
 * 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享
 * @author tcy
 * @Date 29-08-2022
 */
public abstract class AbstractExpression {

    public abstract boolean interpret(String info);
}

非终结符表达式:

/**
 * 非终结符表达式,为文法中的非终结符实现解释操作。对文法中每一条规则R1、R2...Rn都需要一个具体的非终结符表达式类
 * @author tcy
 * @Date 29-08-2022
 */
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 s[]=info.split("-");
        return address.interpret(s[0])&&name.interpret(s[1])&&id.interpret(s[2]);
    }
}

终结符表达式:

**
 * 实现与文法中的终结符相关联的解释操作,文法中每一个终结符都有一个具体终结表达式与之相对应
 * @author tcy
 * @Date 29-08-2022
 */
public class TerminalExpression extends AbstractExpression{

    private 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;
    }
}

上下文环境:

/**
 * 上下文环境
 * @author tcy
 * @Date 29-08-2022
 */
public class Context {
    private String[] shuzis={"1","2","3","4","5","6","7","8","9","0"};
    private String[] xiaoxiezimus={"a","b","c","d","e","f","g","h","i","j","k","l"};
    private String[] daxiezimus={"A","B","C","D","E","F","G"};
    private AbstractExpression infomation;

    public Context()
    {
        AbstractExpression shuzi=new TerminalExpression(shuzis);
        AbstractExpression xiaoxiezimu=new TerminalExpression(xiaoxiezimus);
        AbstractExpression daxiezimu=new TerminalExpression(daxiezimus);
        infomation=new NonTerminalExpression(shuzi,xiaoxiezimu,daxiezimu);
    }

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

}

客户端:

/**
 * @author tcy
 * @Date 29-08-2022
 */
public class Client {
    public static void main(String[] args) {
        Context people=new Context();
        people.jieshi("2-a-A");
        people.jieshi("11-A-5");
        people.jieshi("你-好-吖");
        people.jieshi("2aA");

    }
}

以上为解释器模式的简单案例,读者可以拉取代码到本地进行学习。

三、应用场景

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

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

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

已经连续更新了数十篇设计模式博客,推荐你结合学习。

一、设计模式概述

二、设计模式之工厂方法和抽象工厂

三、设计模式之单例和原型

四、设计模式之建造者模式

五、设计模式之代理模式

六、设计模式之适配器模式

七、设计模式之桥接模式

八、设计模式之组合模式

九、设计模式之装饰器模式

十、设计模式之外观模式

十一、外观模式之享元模式

十二、设计模式之责任链模式

十三、设计模式之命令模式

标签:解释器,终结符,模式,设计模式,public,AbstractExpression
From: https://www.cnblogs.com/tianClassmate/p/16662082.html

相关文章

  • 晓晓---python文件的读写模式的理解
    1.python读取文件模式的自我理解:'r'openforreading(default)----只读模式打开文件,不能写;'w'openforwriting,truncatingthefilefirst----只写模式......
  • C#7.0 模式匹配
    Photoby托马斯·凯利on不飞溅C#7.0模式匹配C#在C#7.0中引入了模式匹配。从那时起,每个主要的C#版本都扩展了模式匹配功能。模式匹配是一种测试表达式以确......
  • 设计模式--生成器模式
    简介生成器模式的核心是当构建一个对象的时候,需要包含多个步骤,虽然每个步骤具体的实现不同,但是都遵循一定的流程和规则。比如组装一辆汽车,需要引擎、座位、变速箱、定位器......
  • 设计模式
    1.单例模式:只能创建一个实例的对象。2.单例模式分类两种:饿汉式:类加载就会导致该对象被创建。静态变量的方式:静态代码块方式懒汉式:类加载不会导致该单例对象被创建,而......
  • Matlab GUI_guide模式编程快速入门教程
    摘要:GUI设计是交互设计,关联界面和软件本体之间的联系,然后一般设计包括实现计算和绘图等等,在软件著作中需要要求是计算严谨,绘图吸引,功能丰富以及具体的实际用途目录1.界......
  • 39 | JAVA_IO_Filter模式(Decorator模式)-cnblog
    Filter模式(Decorator模式)为了解决依赖继承会导致子类数量失控的问题,JDK首先将InputStream分为两大类:一类是直接提供数据的基础InputStream,例如:FileInputStreamByteA......
  • python a+模式读取文件时内容为空
    1.pythona+模式打开文件,然后直接读取,这时候读取出来的内容为空----为什么呢?这是因为打开时是以追加的模式打开的,这时候光标定位在最后,此时读取readline,吃从当前光标开......
  • 阿里 Seata 新版本终于解决了 TCC 模式的幂等、悬挂和空回滚问题
    简介: 今天来聊一聊阿里巴巴Seata新版本(1.5.1)是怎么解决TCC模式下的幂等、悬挂和空回滚问题的。作者:朱晋君 大家好,我是君哥。 今天来聊一聊阿里巴巴S......
  • MySQL 行锁观察模式8.0
    全新的MySQL8.0新增了全新的锁观测方式,在performance_schema下新增了data_locks表和data_lock_waits表mysql>showtableslike'%data_lock%';+-----------------------......
  • 【设计模式】Java设计模式 - 建造者模式
    【设计模式】Java设计模式-建造者模式......