Java设计模式(二十三)----解释器模式

解释器模式
定义:解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。



解释器模式的结构
下面就以一个示意性的系统为例,讨论解释器模式的结构。系统的结构图如下所示:

  模式所涉及的角色如下所示:
  (1)抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。
  (2)终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
  (3)非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+”就是非终结符,解析“+”的解释器就是一个非终结符表达式。
  (4)环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。

具体案例

//上下文环境角色
public class Context {
     private Map<Variable,Integer> valueMap = new HashMap<Variable,Integer>();  

     public void addValue(Variable x , int y)
     {
            valueMap.put(x , y);
     }  

     public int LookupValue(Variable x)  

     {
            int i = valueMap.get(x);
            return i ;
     }
}

//抽象表达式角色,也可以用接口来实现
public abstract class Expression {
    public abstract int interpret(Context con);
}

//终结符表达式角色
public class Constant extends Expression {
    private int i;
    public Constant(int i){
        this.i = i;
    }

    public int interpret(Context con){
        return i;
    }
}

public class Variable  extends Expression{
    public int interpret(Context con)

    {

        // this为调用interpret方法的Variable对象

        return con.LookupValue(this);

    }
}

//非终结符表达式角色
public class Add extends Expression {
    private Expression left, right;

    public Add(Expression left, Expression right)

    {

        this.left = left;

        this.right = right;

    }

    public int interpret(Context con)

    {

        return left.interpret(con) + right.interpret(con);

    }

}

public class Subtract  extends Expression {
    private Expression left, right;

    public Subtract(Expression left, Expression right)

    {

        this.left = left;

        this.right = right;

    }

    public int interpret(Context con)

    {

        return left.interpret(con) - right.interpret(con);

    }
}

public class Multiply extends Expression {
    private Expression left, right;

    public Multiply(Expression left, Expression right)

    {

        this.left = left;

        this.right = right;

    }

    public int interpret(Context con)

    {

        return left.interpret(con) * right.interpret(con);

    }
}

public class Division  extends Expression{
    private Expression left, right;

    public Division(Expression left, Expression right)

    {

        this.left = left;

        this.right = right;

    }

    public int interpret(Context con)

    {

        try {

            return left.interpret(con) / right.interpret(con);

        } catch (ArithmeticException ae)

        {

            System.out.println("被除数为0!");

            return -11111;

        }

    }
}

//测试程序,计算 (a*b)/(a-b+2)
public class Test {
    private static Expression ex,exa,exs,exm;

    private static Context con;

    public static void main(String[] args)

    {

        con = new Context();

        // 设置变量、常量

        Variable a = new Variable();

        Variable b = new Variable();

        Constant c = new Constant(2);

        // 为变量赋值

        con.addValue(a, 10);

        con.addValue(b, 8);

        // 运算,对句子的结构由我们自己来分析,构造
        exs=new Subtract(a, b);
        exa=new Add(exs, c);
        exm=new Multiply(a, b);
        ex = new Division(exm, exa);

        System.out.println("运算结果为:" + ex.interpret(con));

    }
}

优缺点
解释器模式提供了一个简单的方式来执行语法,而且容易修改或者扩展语法。一般系统中很多类使用相似的语法,可以使用一个解释器来代替为每一个规则实现一个解释器。而且在解释器中不同的规则是由不同的类来实现的,这样使得添加一个新的语法规则变得简单。
但是解释器模式对于复杂文法难以维护。可以想象一下,每一个规则要对应一个处理类,而且这些类还要递归调用抽象表达式角色,多如乱麻的类交织在一起是多么恐怖的一件事啊!

以上内容来自平时所看书籍和网络资源整理测试所得,如有不完善之处,欢迎指正!

时间: 2024-08-28 19:00:09

Java设计模式(二十三)----解释器模式的相关文章

Java设计模式编程之解释器模式的简单讲解_java

0.解释器(Interpreter)模式定义 :给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子. 属于行为型模式. 解释器模式在实际的系统开发中使用的非常少,因为它会引起效率.性能以及维护等问题. 解释器模式的通用类图如图所示. 1.解释器模式的优点 解释器是一个简单语法分析工具,它最显著的优点就是扩展性,修改语法规则只要修改相应的非终结符表达式就可以了,若扩展语法,则只要增加非终结符类就可以了. 2.解释器模式的缺点 解释器模式会引起类膨胀:每个语法

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

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

Java设计模式之中介者模式(Mediator Pattern)简介_java

Java设计模式的中介者模式是行为模式之一.定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显式地相互引用,从而使其耦合性松散,并且可以独立地改变他们之间的交互. 如下图所示: 生产者.消费者.代理商之间的中介模式实例: public abstract class PersonColleague { protected Mediator mediator; public Mediator getMediator() { return mediator; } public void

java设计模式之简单工厂模式

在编写一个计算器程序时,可以将业务逻辑和显示分离,业务逻辑封装为一个类(封装):如果要新添加一种运算,可以先创建一个Operation的基类,然后各种运算从Operation类继承,并实现GetResult()虚函数,这时添加新的运算只需要派生一个新的类,即不需要之前的运算参与编译.如何让计算器知道我是希望使用哪种运算呢?应该考虑单独的类来做这个创造实例的过程,这就是工厂.创建一个OperationFactory类,传入参数,函数createOperate就可以实例化出合适的对象. Java代码

解析Java的设计模式编程之解释器模式的运用_java

定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子.类型:行为类模式类图: 解释器模式是一个比较少用的模式,本人之前也没有用过这个模式.下面我们就来一起看一下解释器模式.  解释器模式的结构抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作.具体解释任务由它的各个实现类来完成,具体的解释器分别由终结符解释器TerminalExpression和非终结符解释器Nontermina

解析Java设计模式编程中命令模式的使用_java

定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能.类型:行为类模式类图: 命令模式的结构        顾名思义,命令模式就是对命令的封装,首先来看一下命令模式类图中的基本结构: Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令. ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现. Client类:最终的客户端调用

.Net设计模式实例之解释器模式(Interpreter Pattern)

一.解释器模式简介(Brief Introduction) 解释器模式(Interpreter Pattern),给定一个语言,定义它的文法的一种表示,并定 义一个解释器,这个解释器使用该表示来解释语言中的句子.使用了解释器模式,可以很容 易地改变和扩展文法,因为该模式使用类来表示文法规则,可以使用继承来改变或扩展该文 法.也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类容 易直接编写. 二.解决的问题(What To Solve) 如果一种特定类型的问题发生的频率足够

java设计模式之工厂方法模式_java

概要 设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美. 定义 定义一个用于创建对象的接口,让其子类去决定实例化那个类 使用场景 任何使用复杂对象的地方,都可以使用工厂模式 UML 1.抽象工厂  抽象工厂:我们都知道,工厂,一般只有一个作用,那就生产,比如,吉利汽车厂,那就制造吉利汽车,iphone手机制造厂就造iphone等等 所以可以用一个简单的方法概括,就是create(); 2.具体汽车制造厂  具体汽车制造厂:实现了抽象工厂,具有实际的制造汽车的流程和方法等

Java设计模式之享元模式学习笔记

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象. Java中String的实现就是一个典型的享元模式应用,Java中的String存在字符串常量池中,Java会确保一个字符串常量在常量池中只有一个拷贝.数据库连接池也是一个比较电信的享元模式应用,可简单理解为先初始化一定数量的数据库连接,

深入解析C++设计模式编程中解释器模式的运用_C 语言

解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子.这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题.当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式.用了解释器模式,就意味着可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,