设计模式(23)解释器模式

这篇具有很好参考价值的文章主要介绍了设计模式(23)解释器模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍:

1、定义:解释器(Interpreter)模式是一种对象的行为模式。给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

2、组成结构:

设计模式(23)解释器模式,设计模式(java语言),设计模式
(1)AbstractExpression(抽象表达式):约定解释器的解释操作,主要是一个interpret()方法。这个接口作为抽象语法树中所有节点(即终结符表达式和非终结符表达式)所共享

public abstract class AbstractExpression {
    public abstract void interpret(Context context);
}

(2) TerminalExpression(终结符表达式):用来实现文法中和终结符相关的解释操作,不再包含其它的解释器,如果用组合模式来构建抽象语法树的话,就相当于组合模式中的叶子对象,可以有多种终结符解释器。

public class TerminalExpression extends AbstractExpression{

    @Override
    public void interpret(Context context) {
        System.out.println("终结符解释器");
    }
}

(3)NonterminalExpression(非终结表达式):用来实现文法中和非终结符相关的解释操作,通常一个解释器对应一个语法规则,可以包含其它的解释器,如果用组合模式来构建抽象语法树的话,就相当于组合模式中的组合对象,可以有多种非终结符解释器。公式R=R1+R2中,R1、R2为终结符表达式,+为非终结表达式(其后需要跟随一个终结符表达式)。

public class NonterminalExpression extends AbstractExpression{

    @Override
    public void interpret(Context context) {
        System.out.println("非终结符解释器");
    }
}

(4) Context类(包含解释器之外的一些全局信息):也称“上下文”,常用HashMap来代替,通常包含解释器之外的一些全局信息(解释器需要的数据,或是公共的功能)。

public class Context {
    private String input;
    private String output;

    //Get、Set方法省略
}

客户端,构建文法表示的抽象语法树(Abstract Syntax Tree),该抽象语法树由终结符表达式和非终结符表达式的实例装配而成),并调用解释操作interpret()方法。 

Context context = new Context();
        List<AbstractExpression> list = new ArrayList<AbstractExpression>();
        list.add(new TerminalExpression());
        list.add(new NonterminalExpression());
        list.add(new TerminalExpression());
        list.add(new NonterminalExpression());
        for (AbstractExpression abstractExpression : list) {
            abstractExpression.interpret(context);
        }

3、适用场景:解释器模式似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个语言的文法。建议在以下情况中选用解释器模式: 当有一个语言需要解释执行,并且可以将语言中的句子表示为一个抽象语法树的时候,可以考虑使用解释器模式。  

二、demo:

1、加减法计算器:文章来源地址https://www.toymoban.com/news/detail-740265.html

//抽象表达式
public interface AbstractExpression {
     int interprete(HashMap<String, Integer> var);
}


//终结符表达式
public class VarExpression  implements AbstractExpression {

    private String key;

    public VarExpression(String key) {
        this.key = key;
    }

    public int interprete(HashMap<String, Integer> var) {
        return (Integer) var.get(this.key);
    }
}



//加法符号  非终结表达式
public class AddExpression implements AbstractExpression{

    private AbstractExpression left;
    private AbstractExpression right;

    public AddExpression(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    // 把左右两个表达式运算的结果加起来
    public int interprete(HashMap<String, Integer> var) {
        return this.left.interprete(var) + this.right.interprete(var);
    }
}



//减法符号  非终结表达式
public class SubExpression implements AbstractExpression{

    private AbstractExpression left;
    private AbstractExpression right;

    public SubExpression(AbstractExpression left, AbstractExpression right) {
        this.left = left;
        this.right = right;
    }

    // 把左右两个表达式运算的结果加起来
    public int interprete(HashMap<String, Integer> var) {
        return this.left.interprete(var) - this.right.interprete(var);
    }
}
//封装计算器类
public class Calculator {

    private AbstractExpression expression;

    public Calculator(String expStr) {
        // 定义一个堆栈,安排运算的先后顺序
        Stack<AbstractExpression> stack = new Stack<AbstractExpression>();
        // 表达式拆分为字符数组
        char[] charArray = expStr.toCharArray();
        // 运算
        AbstractExpression left = null;
        AbstractExpression right = null;
        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 calculate(HashMap<String, Integer> var) {
        return this.expression.interprete(var);
    }
}


//客户端
public static void main(String args[]){
        // 构造运算元素的值列表
        HashMap<String, Integer> ctx = new HashMap<String, Integer>();
        ctx.put("a", 10);
        ctx.put("b", 20);
        ctx.put("c", 30);
        ctx.put("d", 40);
        ctx.put("e", 50);
        ctx.put("f", 60);
        Calculator calc = new Calculator("a+b-c");
        int result = calc.calculate(ctx);
        System.out.println("Result of a+b-c: " + result);
        calc = new Calculator("d-a-b+c");
        result = calc.calculate(ctx);
        System.out.println("Result of d-a-b+c: " + result);
    }


输出:
Result of a+b-c: 0
Result of d-a-b+c: 40

到了这里,关于设计模式(23)解释器模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java设计模式之解释器设计模式的前世今生

    解释器设计模式是什么? 解释器模式是一种行为型设计模式,它定义了一种以语法表达式的形式来表示特定规则的语言,并提供了一种解释器来解释这些语法表达式的实现方法。解释器模式通常用于构建编程语言、词法分析、正则表达式、数学表达式等应用程序。它提供了一

    2024年02月06日
    浏览(30)
  • 设计模式-解释器设计模式

    解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于解释一种语言或表达式的语法。该模式主要用于自定义语言解释、查询解析和规则引擎等领域。在解释器模式中,我们定义了一个解释器类,用于解释和执行特定语法规则的表达式。 在本篇博客中,我们将详细介

    2024年02月09日
    浏览(35)
  • 设计模式:解释器模式

    解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言的文法,并且定义了该语言中各个元素的解释器。通过使用解释器,可以解析和执行特定的语言表达式。 解释器模式的核心思想是将一个语言的文法表示为一个类的层次结构,并使用该类的实例来表示

    2024年02月07日
    浏览(33)
  • 设计模式——解释器模式

    更多内容,前往IT-BLOG 在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的表达式(例如:正则表达式等),那么这些问题实例将是该表达式的一些句子,这样就可以用 “编译原理” 中的解释器模式来实现。 【1】解释

    2024年02月03日
    浏览(26)
  • 设计模式详解-解释器模式

    类型:行为型模式 实现原理:实现了一个表达式接口,该接口使用标识来解释语言中的句子 作用:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器来解释。 主要解决:一些重复的固定文法分别创建解释器会很麻烦 何时使用:某一种特定类型的问题发生的

    2024年02月12日
    浏览(38)
  • 解释器设计模式

    解释器设计模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言的文法,并建立一个解释器来解释该语言中的句子。这种模式通常用于需要解释或执行一种特定类型的语言的场景,例如编程语言的编译器或解释器、规则引擎系统等。 关键组成部分 抽象表达式(

    2024年02月21日
    浏览(38)
  • 设计模式(行为型模式)解释器模式

       解释器模式(Interpreter Pattern) 是一种行为设计模式,用于解释特定语言或处理特定问题领域的语法或表达式。它定义了一种语言的语法表示,并使用该表示来解释语言中的句子。通常用于构建解析器、编译器和规则评估引擎等场景。 在解释器模式中,有以下关键角色:

    2024年02月20日
    浏览(33)
  • js设计模式:解释器模式

    对文本进行解释和编译的时候,就会用到解释器模式 比如你写了一段js代码,js引擎就会去解释并执行这段代码 webpack中的各种loader就是用来解释各种文件类型的,并将其解释为js可识别的代码

    2024年02月22日
    浏览(31)
  • 设计模式之解释器模式(下)

    3)Context的作用 1.概述 在解释器模式中,环境类Context用于存储解释器之外的一些全局信息,它通常作为参数被传递到所有表达式的解释方法interpret()中,可以在Context对象中存储和访问表达式解释器的状态,向表达式解释器提供一些全局的、公共的数据,此外还可以在Context中

    2024年04月12日
    浏览(30)
  • 设计模式之解释器模式笔记

    记录下学习设计模式-解释器模式的写法。JDK使用版本为1.8版本。 意图 :定义一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 结构 : 其中: AbstractExpression 声明一个程序的解释操作,这个接口为抽象语法树中所有的结点所

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包