Java设计模式之十七(解释器模式)
2013-04-25 09:41
281 查看
一、什么是解释器模式
Interpreter模式也叫解释器模式,是行为模式之一,它是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言,用来解释预先定义的文法。简单地说,Interpreter模式是一种简单的语法解释器构架。
二、解释器模式应用场景
当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。
效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。
三、解释器模式的结构
四、解释器模式的角色和职责
Context 解释器上下文环境类。用来存储解释器的上下文环境,比如需要解释的文法等。
AbstractExpression 解释器抽象类。
ConcreteExpression 解释器具体实现类
代码实现:
Context:
AbstractExpression:
ConcreteExpression:
测试类:
测试结果:
Interpreter模式也叫解释器模式,是行为模式之一,它是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言,用来解释预先定义的文法。简单地说,Interpreter模式是一种简单的语法解释器构架。
二、解释器模式应用场景
当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。
效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。
三、解释器模式的结构
四、解释器模式的角色和职责
Context 解释器上下文环境类。用来存储解释器的上下文环境,比如需要解释的文法等。
AbstractExpression 解释器抽象类。
ConcreteExpression 解释器具体实现类
代码实现:
Context:
package com.qianyan.interpreter; /** * 上下文环境,用来保存文法 * @author hadoop * */ public class Context { private String input; private int output; public Context(String input) { this.input = input; } public String getInput() { return input; } public void setInput(String input) { this.input = input; } public int getOutput() { return output; } public void setOutput(int output) { this.output = output; } }
AbstractExpression:
package com.qianyan.interpreter; /** * 抽象解释器 * @author hadoop * */ public abstract class Expression { public abstract void interpret(Context context); }
ConcreteExpression:
package com.qianyan.interpreter; /** * * @author hadoop * */ public class PlusExpression extends Expression { @Override public void interpret(Context context) { //提示信息 System.out.println("自动递增"); //获取上下文环境 String input = context.getInput(); //转换类型 int intInput = Integer.parseInt(input); //进行递增 intInput++; //对上下文环境重新进行赋值 context.setInput(intInput + ""); context.setOutput(intInput); } }
package com.qianyan.interpreter; public class MinusExpression extends Expression { @Override public void interpret(Context context) { //提示信息 System.out.println("自动递减"); //获得上下文环境 String input = context.getInput(); //类型转换 int intInput = Integer.parseInt(input); //进行递减 intInput--; //对上下文环境重新赋值 context.setInput(intInput + ""); context.setOutput(intInput); } }
测试类:
package com.qianyan.interpreter; import java.util.ArrayList; import java.util.List; /** * client * @author hadoop * */ public class MainClass { public static void main(String[] args) { Context context = new Context("20"); List<Expression> list = new ArrayList<Expression>(); list.add(new PlusExpression()); list.add(new PlusExpression()); list.add(new MinusExpression()); list.add(new MinusExpression()); list.add(new PlusExpression()); list.add(new PlusExpression()); for(Expression ex : list) { ex.interpret(context); System.out.println(context.getOutput()); } } }
测试结果:
自动递增 21 自动递增 22 自动递减 21 自动递减 20 自动递增 21 自动递增 22
相关文章推荐
- JAVA--责任链模式(Chain of Responsibility)--设计模式十七
- Java设计模式--解释器模式【Interpreter Pattern】
- 浅谈Java设计模式(十七)责任链模式(Chain of Responsibility)
- 【Java设计模式】· 解释器模式(Interpreter Pattern)
- java设计模式_解释器模式
- java基础学习之设计模式 十七
- java设计模式18_解释器模式
- Java设计模式百例 - 解释器模式
- 设计模式之第5章-解释器模式(Java实现)
- JAVA设计模式十五:--Interpreter(解释器模式)
- 23种设计模式(15)java解释器模式
- Java设计模式--解释器模式
- JAVA设计模式(22):行为型-解释器模式(Interpreter)
- Java设计模式之从[计算器]分析解释器(Interpreter)模式
- Java设计模式之解释器模式_动力节点Java学院整理
- Java设计模式百例 - 解释器模式
- JAVA设计模式(十五)——解释器模式
- JAVA设计模式(十五)----解释器模式
- Java设计模式之解释器模式
- Java设计模式《二十三》解释器模式