通过本文将学习到
1、前言
2、解释器模式的概念
3、解释器的UML图及角色结构
4、解释器模式的实现
5、解释器模式的优缺点及使用场景
6、总结
上一场我聊过了命令模式,只是浅显的过了一遍。接下来要谈谈解释器模式了。
对了,突然想聊聊鲁迅先生,如果在整个学生时代要说我最喜欢的文学家的话,周树人先生当之无愧!他的语句犹如手术刀般的锋利,可以直刺心窝!可以,引起人强烈的情感共鸣!
真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。这是怎样的哀痛者和幸福者?然而造化又常常为庸人设计,以时间的流驶,来洗涤旧迹,仅使留下淡红的血色和微漠的悲哀。在这淡红的血色和微漠的悲哀中,又给人暂得偷生,维持着这似人非人的世界。我不知道这样的世界何时是一个尽头!
好吧,鲁迅先生就谈到这里吧!
解释器模式用于描述如何设计一个简单的语言解释器,主要用于使用面向对象语言开发的解释器的设计。
解释器模式:给定一个语言,定义它的文法得一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
解释器,讲出来你可能不信,居然要用到编译原理和汇编语言的知识,要知道文法,及用汇编将文法给表示。原来以前学的东西还是非常有用的得抽时间去学习一下子了。
AbstarctExpression(抽象表达式):再抽象表达式种声明了抽象的解释操作,它是所有终结符表达式和非总结符表达式的公共父类。
TerminalExpression(终结符表达式):终结符表达式是抽象表达式的子类,它实现了与文法中的终结符相关的解释操作,在句子中的每一个终结符都是该类的一个实例。
NonterminalExpression(非终结符表达式):非终结符表达式也是抽象表达式的子类实现了文法中非终结符的解释操作,由于在非终结符表达式中可以包含终结符表达式。也可以继续包含非终结符表达式。
Context(环境类):环境类又可以称为上下文类,它用于存储解释器之外的一些全局信息,通常它临时存储了需要解释的语句。
package interpreterPattern;
public abstract class AbstractNode {
public abstract String interpret();
}
package interpreterPattern;
public class AndNode extends AbstractNode{
private AbstractNode left; //左表达式
private AbstractNode right; //右表达式
public AndNode(AbstractNode l,AbstractNode r) {
// TODO Auto-generated constructor stub
this.left=l;
this.right=r;
}
@Override
public String interpret() {
// TODO Auto-generated method stub
return left.interpret()+"再"+right.interpret();
}
}
package interpreterPattern;
public class SentenceNode extends AbstractNode{
private AbstractNode direction;
private AbstractNode action;
private AbstractNode distanc;
public SentenceNode(AbstractNode direc,AbstractNode a,AbstractNode d) {
// TODO Auto-generated constructor stub
this.direction=direc;
this.action=a;
this.distanc=d;
}
@Override
public String interpret() {
// TODO Auto-generated method stub
return direction.interpret()+action.interpret()+distanc.interpret();
}
}
package interpreterPattern;
public class DirectionNode extends AbstractNode {
private String direction;
public DirectionNode(String dir) {
// TODO Auto-generated constructor stub
this.direction=dir;
}
@Override
public String interpret() {
// TODO Auto-generated method stub
if(direction.equalsIgnoreCase("up")) {
return "向上";
}else if(direction.equalsIgnoreCase("down")) {
return "向下";
}else if(direction.equalsIgnoreCase("left")) {
return "向左";
}else if(direction.equalsIgnoreCase("right")) {
return "向右";
}else {
return "无效指令";
}
}
}
package interpreterPattern;
public class ActionNode extends AbstractNode {
private String action;
public ActionNode(String a) {
// TODO Auto-generated constructor stub
this.action=a;
}
@Override
public String interpret() {
// TODO Auto-generated method stub
if(action.equalsIgnoreCase("move")) {
return "移动";
}else if(action.equalsIgnoreCase("run")) {
return "奔跑";
}else {
return "无效指令";
}
}
}
package interpreterPattern;
public class DistanceNode extends AbstractNode{
private String distance;
public DistanceNode(String d) {
// TODO Auto-generated constructor stub
this.distance=d;
}
@Override
public String interpret() {
// TODO Auto-generated method stub
return distance;
}
}
package interpreterPattern;
import java.util.Stack;
public class InstructionHandler {
private AbstractNode node;
public void Handle(String instruction) {
//用栈来保存语法树。
AbstractNode left=null,right=null;
AbstractNode direction=null,action=null,distance=null;
Stack stack = new Stack();
//用空格分隔指令
String[] word = instruction.split(" ");
//循环
for(int i=0;i
package interpreterPattern;
public class Client {
public static void main(String[] args) {
String instruction ="down run 10 and left move 20";
InstructionHandler iHandler = new InstructionHandler();
iHandler.Handle(instruction);
String outString ;
outString =iHandler.output();
System.out.println(outString);
}
}
优点:
缺点:
使用场景:
这个模式整个没搞懂,这个模式是我目前学过里面最没搞清楚的一个模式。但是没关系,反正用不到。以后如果假如用到了就再复习呗。还有就是,学习直接背吧。不然没效果,你说了?