`

解释器模式

阅读更多

      解释器模式:给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
由定义来看,解释器模式就是一个不常用的模式,但是学习一下也没有坏处.
我第一次听到解释器模式的时候想到的东西就是命令行(CMD)解释器,这就是典型的望文生义.但是解释器模式也没有想象中的复杂, 先举两个例子来对解释器模式建立一个大体的印象.第一个是: 早期的手机中都有一个铃声编辑器, 你可以自己输入1 2 3 4 5 6 7 等来编辑一个铃声,手机中一定有一个程序来读取你编辑的文件,然后按照一定的发音规则来播放它们. 那么这个播放程序就是一个解释器, 输入的乐谱就是就是音乐的文法表示. 另一个例子: 银行经常要用复杂而变化的模型来计算数据, 比如(1+r)^n*c, (r=Rate, n=Years, c=Capital)这个公示就是计算一笔存款存n年之后的的总额.如果说这个公式比较固定不变, 那么我们写一个函数/方法就搞定了, 但是如果随着银行产品种类的增多, 业务种类的增多, 公式将会多种多样,已经不再可能用函数来应对需求的变化,于是可以有一个公式编辑器,程序通过解析公式,然后给公式的参数赋值就可以应对需求. 那么这个程序就是一个解释器.


      以一个简单的模型公式为例实现一个解释, 要求指定参与运算的元素(如a,b,c),然后输入公式即可计算出结果. 为了演示的方便,只考虑加减法.如果一个系统中参与运算的元素为a,b,c,d ... 当然这些元素背后对应的物理意义或者业务意义我们就不细追究. 客户端指定一个公式,如 a+b-c, a+b+c-d, 就可以计算出结果.

      package designpattern.intpreter;  
import java.util.HashMap;  
 
public interface Expression {  
    public int interprete(HashMap<String,Integer> var);  
}  
//////////////////////////  
package designpattern.intpreter;  
 
import java.util.HashMap;  
 
public class VarExpression implements Expression{  
    private String key;  
    public VarExpression(String key){  
        this.key = key;  
    }  
      
    public int interprete(HashMap<String,Integer> var) {  
        return (Integer)var.get(this.key);  
    }  
}  
////////////////////////////  
package designpattern.intpreter;  
 
public abstract class SymbolExpression implements Expression {  
    protected Expression left;  
    protected Expression right;  
 
    // 所有的解析公式都应只关心自己左右两个表达式的结果  
    public SymbolExpression(Expression left, Expression right) {  
        this.left = left;  
        this.right = right;  
    }  
}  
//////////////////////////////////  
package designpattern.intpreter;  
 
import java.util.HashMap;  
 
public class AddExpression extends SymbolExpression {  
    public AddExpression(Expression _left, Expression _right) {  
        super(_left, _right);  
    }  
 
    // 把左右两个表达式运算的结果加起来  
    public int interprete(HashMap<String, Integer> var) {  
        return super.left.interprete(var) + super.right.interprete(var);  
    }  
}  
///////////////////////////////////  
package designpattern.intpreter;  
 
import java.util.HashMap;  
 
public class SubExpression extends SymbolExpression {  
    public SubExpression(Expression _left, Expression _right) {  
        super(_left, _right);  
    }  
 
    // 左右两个表达式相减  
    public int interprete(HashMap<String, Integer> var) {  
        return super.left.interprete(var) - super.right.interprete(var);  
    }  
 
}  
////////////////////////////  
package designpattern.intpreter;  
import java.util.HashMap;  
import java.util.Stack;  
 
public class Calculator {  
    private Expression expression;  
    public Calculator(String expStr) {  
        // 定义一个堆栈,安排运算的先后顺序  
        Stack<Expression> stack = new Stack<Expression>();  
        // 表达式拆分为字符数组  
        char[] charArray = expStr.toCharArray();  
        // 运算  
        Expression left = null;  
        Expression 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 run(HashMap<String, Integer> var) {  
        return this.expression.interprete(var);  
    }  
}  
//////////////////////////////  
//测试用例  
package designpattern.intpreter;  
import java.util.HashMap;  
 
public class Client {  
    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.run(ctx);  
        System.out.println("Result of a+b-c: " + result);  
        calc = new Calculator("d-a-b+c");  
        result = calc.run(ctx);  
        System.out.println("Result of d-a-b+c: " + result);  
    }  

 

分享到:
评论

相关推荐

    设计模式之解释器模式Java版本实现

    解释器模式是一种行为设计模式,它允许我们定义一个语言的语法,并提供一个解释器来解析该语言中的句子。在Java中实现解释器模式,我们可以创建一个抽象表达式接口,然后为每种特定的语法结构创建一个具体表达式类。...

    解释器模式例子

    解释器模式是一种设计模式,它允许我们为特定的语言或表达式定义一个解析规则,并通过这个规则来解释执行这些语言或表达式。在本例子中,我们将深入探讨如何使用解释器模式来实现一个能够理解并执行机器人指令的系统...

    设计模式之解释器模式(Interpreter Pattern)

    **设计模式之解释器模式(Interpreter Pattern)** 解释器模式是一种行为设计模式,它提供了一种方式来表示语言的语法,并实现一个解释器用于解析这种语法的语句。这种模式通常用于小型、特定领域的语言(DSL)实现,...

    设计模式之解释器模式(Interpreter)

    **解释器模式(Interpreter)**是一种行为设计模式,它允许我们定义一种语言并为其创建一个解释器。在软件工程中,这种模式常用于处理简单的语言或表达式,例如配置文件、计算公式或者简单的脚本语言。通过使用解释...

    解释器模式代码示例

    解释器模式是一种设计模式,它允许我们为特定的语言或表达式定义一个解析规则,并提供一个解释器来执行这些规则。这种模式在处理简单的语言或结构化表达式时特别有用,例如配置文件、简单的数学表达式或者编程语言的...

    设计模式----解释器模式

    解释器模式(Interpreter Pattern)是25种经典设计模式之一,主要应用于创建一个解析语言或者表达式的方式。在本篇文章中,我们将深入探讨解释器模式的概念、结构以及其在实际开发中的应用。 解释器模式是一种行为...

    [行为型模式] 解释器模式的理解

    **行为型模式——解释器模式** 解释器模式是一种设计模式,它允许我们为特定语言创建一个解析器。这种模式在处理简单的语言或表达式时特别有用,例如配置文件、简单的编程语言或者数学表达式。解释器模式的核心在于...

    第十七讲:解释器模式

    解释器模式是一种设计模式,它允许我们为特定的语言或表达式定义一个解析规则。在软件工程中,这种模式常用于构建简单的语言解释器或者执行基于某种规则的逻辑。本讲将深入探讨解释器模式的原理、结构以及在实际开发...

    设计模式-解释器模式(讲解及其实现代码)

    **解释器模式**是一种行为设计模式,它提供了一种方式来表示语言的语法,并通过类和对象解析这种语法。在编程领域,解释器模式常用于创建简单的语言或表达式解析器,例如配置文件、计算器应用或者SQL查询的简化版本...

    72丨解释器模式:如何设计实现一个自定义接口告警规则功能?1

    解释器模式是一种设计模式,用于创建能解析特定语言或规则集的解释器。这种模式的核心在于定义一个表达式的抽象语法树(AST),并提供一个解释器来遍历这棵树,执行与之相关的操作。在 GoF 的《设计模式》书中,解释...

    Ansy.rar_C语言解释器_解释 语言_解释器_解释器模式_语言解释器

    《C语言解释器的实现与解释器模式解析》 在编程世界中,编译器和解释器是两种关键的工具,它们将高级编程语言转换为机器可以理解的指令。本篇我们将聚焦于“C语言解释器”的实现,以及在设计过程中所采用的“解释器...

    第19章_解释器模式.ppt

    如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一...解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。

    Android解释器模式简单Demo

    Android解释器模式简单Demo,通过实现计算器四则运算,加减的逻辑,来领悟解释器这种模式的设计,同步博文:http://blog.csdn.net/qq_28690547/article/details/50707916

    c++设计模式-行为型模式-解释器模式

    c++设计模式-行为型模式-解释器模式;qt工程;c++简单源码; 解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式...

    解释器模式案例源码Demo

    解释器模式,也被称为解析器模式,是一种设计模式,它允许我们定义一套语言的文法,并为这个语言提供解释器。这种模式常用于构建小型、特定领域的语言,比如配置文件、简单的脚本或计算器等。在Java、Python等面向...

    解释器模式(Interpreter)原理图

    解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义一个语言的文法,并解析语言中的表达式。具体来说,解释器模式通过定义一个解释器来解释语言中的表达式,从而实现对语言的解析和执行。 在解释...

    【Java设计模式】解释器模式

    该应用程序使用Java中的解释器模式来解析和评估算术表达式,如“5 + 3 * 2”。在这里,解释器将表达式的每个部分转换为表示数字和操作的对象。这些对象遵循定义的语法,使应用程序能够根据算术规则正确理解和计算...

Global site tag (gtag.js) - Google Analytics