Behavioral模式之Interpreter模式

1.意图

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

2.别名

3.动机

如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各种实例表述为一种简单语句中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

4.适用性

以下情况使用Interpreter模式:

当有一种语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可使用解释器模型。而当存在以下情况时该模式效果最好。

- 该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。他们无需构建抽象语法树即可解释表达式,这样可以节省空间而且还可能节省时间。

- 效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将他们转换成另一种形态。例如,正则表达式通常被转换成状态机。但及时在这种情况下,转化器仍可用解释器模式实现,该模式仍是有用的。

5.结构

释器模式是我们暂时的最后一讲,一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄。

6.代码示例

实现代码:

Context类是一个上下文环境类,Plus和Minus分别是用来计算的实现,代码如下:

public interface Expression {
    public int interpret(Context context);
}

实现类

public class Plus implements Expression {

    @Override
    public int interpret(Context context) {
        return context.getNum1()+context.getNum2();
    }
}

public class Minus implements Expression {

    @Override
    public int interpret(Context context) {
        return context.getNum1()-context.getNum2();
    }
}

Context类

public class Context {

    private int num1;
    private int num2;

    public Context(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    public int getNum1() {
        return num1;
    }
    public void setNum1(int num1) {
        this.num1 = num1;
    }
    public int getNum2() {
        return num2;
    }
    public void setNum2(int num2) {
        this.num2 = num2;
    }

}

测试类:

public class Test {

    public static void main(String[] args) {

        // 计算9+2-8的值
        int result = new Minus().interpret((new Context(new Plus()
                .interpret(new Context(9, 2)), 8)));
        System.out.println(result);
    }
}

最后输出正确的结果:3。

基本就这样,解释器模式用来做各种各样的解释器,如正则表达式等的解释器等等!

7.相关模式

  • Composite模式:抽象语法树是一个复合模式的实例。
  • Flyweight模式:说明了如何在抽象语法树中共享终结符。
  • Iterator模式:解释器可用一个迭代器遍历该结构。
  • Visitor模式:可用来在一个类中维护抽象语法树中的各节点的行为。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm

http://item.jd.com/10057319.html

http://blog.csdn.net/zhangerqing/article/details/8239539

时间: 2024-10-17 19:08:46

Behavioral模式之Interpreter模式的相关文章

Java解释器模式(Interpreter模式)

Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个语言的文法.我们还是来简单的了解一下. 首先要建立一个接口,用来描述共同的操作. public interface AbstractExpression { void interpret( Context context ); } 再看看包含解释器之外的一些全局信息 public interface

Interpreter模式(C++解释器模式)

Interpreter模式提供了一个实现语法解释器的框架,其目的就是使用一个解释器为用户提供一个一门定义语言语法表示的解释器,并且通过这个解释器来解释语言中的句子. Interpreter模式使用类来表示文法规则,因此方便于文法的扩展. 代码如下: #include <iostream> #include <string> using namespace std; class Context { public: Context(){} ~Context(){} }; class A

Interpreter 模式详解--设计模式(22)

Interpreter 模式的来源: Interpreter(解释器)模式是一种特殊的设计模式,它建立一个解释器(Interpreter),对于特定的计算机程序设计语言,用来解释预先定义的文法.简单地说,Interpreter模式是一种简单的语法解释器构架.解释器模式属于行为模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. Interpreter 模式作用:     正如其名,此模式大多用来解释一些(自定义的)独特语法,例如某些游戏开发引擎中

Behavioral模式之Visitor模式

1.意图 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 2.别名 无 3.动机 考虑一个编译器,他将源程序表示为一个抽象语法树.该编译器需要在抽象语法上实施某些操作以进行"静态语义"分析,例如检查是否所有的变量都已经被定义了.他也需要生成代码.因为它可能要定义许多操作以进行代码检查.代码优化.流程分析.检查变量是否在使用前被赋初值,等等.此外,还可使用抽象语法树进行优美格式打印.程序重构.code instrumentati

Java 实现解释器(Interpreter)模式

/** * 声明一个抽象的解释操作 * @author stone * */ public interface Interpreter { public void interpret(Context context); //实际中,可以有个返回的类型,定义解释出的数据对象 } public class XmlSaxInterpreter implements Interpreter { @Override public void interpret(Context context) { Syst

深入浅出设计模式——解释器模式(Interpreter Pattern)

模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题.解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中. 模式定义解释器模式(Interpreter Pattern) :定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码,它是一种类行为型模式.Interpreter Pattern: Give

设计模式---领域规则模式之解析器模式(Interpreter)

前提:领域规则模式 在特定领域内,某些变化虽然频繁,但可以抽象为某种规则.这时候,结合特定领域,将问题抽象为语法规则,从而给出该领域下的一般性解决方案. 典型模式 解析器模式:Interpreter 一:解释器模式Interpreter (一)概念 一些应用提供了内建(Build-In)的脚本或者宏语言来让用户定义他们能够在系统中进行的操作.Interpreter模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过解释器来解释语言中的句子.Interpreter模式

Behavioral模式之Memento模式

1.意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. 2.别名 Token 3.动机 有时候有必要记录一个对象的内部状态.为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制,而要实现这些机制,你必须事先将状态信息保存在某处,这样才能是对象恢复到他们先前的状态. 4.适用性 以下情况使用Memento模式: 必需保存一个对象在某一时刻的(部分)状态,这样以后需要时它能恢复到先前的状态. 如果一个用接口

解释器模式(Interpreter)

一.解释器模式介绍 解释器模式:给定一个语言,定义它的文法一种表示.并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 也就是说,如果你想自己开发一种语言来解释执行某些语言的特定语法,可以考虑使用解释器模式. 该模式对于我们开发人员来说,基本上都用不到.除非你想自己开发一种语言. 解释器模式真正开发起来很难,就相当于自己开发了一种语言给别人用. 解释器模式UML图: 二.应用场景 通常来说,当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树叶,则可以使用解释器模式.