JAVA解释器模式

JAVA解释器模式

通过本文将学习到

1、前言

2、解释器模式的概念

3、解释器的UML图及角色结构

4、解释器模式的实现

5、解释器模式的优缺点及使用场景

6、总结


1、前言

上一场我聊过了命令模式,只是浅显的过了一遍。接下来要谈谈解释器模式了。

对了,突然想聊聊鲁迅先生,如果在整个学生时代要说我最喜欢的文学家的话,周树人先生当之无愧!他的语句犹如手术刀般的锋利,可以直刺心窝!可以,引起人强烈的情感共鸣!

真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。这是怎样的哀痛者和幸福者?然而造化又常常为庸人设计,以时间的流驶,来洗涤旧迹,仅使留下淡红的血色和微漠的悲哀。在这淡红的血色和微漠的悲哀中,又给人暂得偷生,维持着这似人非人的世界。我不知道这样的世界何时是一个尽头!

好吧,鲁迅先生就谈到这里吧!

解释器模式用于描述如何设计一个简单的语言解释器,主要用于使用面向对象语言开发的解释器的设计。 

2、解释器模式的概念

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

解释器,讲出来你可能不信,居然要用到编译原理和汇编语言的知识,要知道文法,及用汇编将文法给表示。原来以前学的东西还是非常有用的得抽时间去学习一下子了。

3、解释器的UML图及角色结构

JAVA解释器模式_第1张图片

AbstarctExpression(抽象表达式):再抽象表达式种声明了抽象的解释操作,它是所有终结符表达式和非总结符表达式的公共父类。

TerminalExpression(终结符表达式):终结符表达式是抽象表达式的子类,它实现了与文法中的终结符相关的解释操作,在句子中的每一个终结符都是该类的一个实例。 

NonterminalExpression(非终结符表达式):非终结符表达式也是抽象表达式的子类实现了文法中非终结符的解释操作,由于在非终结符表达式中可以包含终结符表达式。也可以继续包含非终结符表达式。

Context(环境类):环境类又可以称为上下文类,它用于存储解释器之外的一些全局信息,通常它临时存储了需要解释的语句。

 

4、解释器模式的实现

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);
	}
}

 

5、解释器模式的优缺点及使用场景

优点:

  1. 易于改变和扩展文法,由于在解释器模式中使用类表示语言的文法规则,因此可以通过继承等机制来改变和扩张文法。
  2. 每一条文法规则都可以表示为一个类,因此可以方便地实现每一个简单的语言。
  3. 实现文法比较容易。

缺点:

  1. 对于复杂文法难以维护,再解释模式下每一条规则至少定义一个类,因此如果太复杂无法处理。
  2. 执行效率低,由于大量使用了循环和递归。因此再解释很复杂的句子时速度很慢

使用场景:

  • 可以将一个需要解释执行的语言中的句子表示为一个抽象树。
  • 一些重复出现的问题可以用简单的语言进行表达。
  • 执行效率不是关键问题。

6、总结

这个模式整个没搞懂,这个模式是我目前学过里面最没搞清楚的一个模式。但是没关系,反正用不到。以后如果假如用到了就再复习呗。还有就是,学习直接背吧。不然没效果,你说了?

你可能感兴趣的:(技术总结学习,设计模式)