解释器模式(Interpreter Pattern)


解释器模式应用场景比较小,也没有固定的DEMO,中心思想就是自定义解释器用来解释固定的对象

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

 

  DEMO的话随便转载了一个写的比较清晰的博主的博客,博主信息如下(代码做了微小修改):

  @Author      风一样的码农
  @HomePageUrl http://www.cnblogs.com/chenpi/
  @Copyright      转载请注明出处,谢谢~

代码:

1、解释器规则:

package com.pat.Interpreter;

import java.util.Map;

/*
* 解释器规则类,本类定义一些语法规则,解释器应用本类中的规则进行解析文本
* @author ZX
*/ /**
* 条件表达式接口,用于解析语法规则
* @author ZX
*/
public interface Expression {
public int interpret(Map<String,Expression> variables);
}
/**
* 数字
*/
class Number implements Expression{
private int number;
@Override
public int interpret(Map<String, Expression> variables) { return number;
}
public Number() {}
public Number(int number) {
this.number=number;
} }
/**
* 加
*/
class Plus implements Expression{
private Expression leftExp;
private Expression rightExp;
@Override
public int interpret(Map<String, Expression> variables) { return leftExp.interpret(variables)+rightExp.interpret(variables);
}
public Plus(){}
public Plus(Expression leftExp,Expression rightExp){
this.leftExp=leftExp;
this.rightExp=rightExp;
}
}
/**
* 减
*/
class Minus implements Expression{
private Expression leftExp;
private Expression rightExp;
@Override
public int interpret(Map<String, Expression> variables) { return leftExp.interpret(variables)-rightExp.interpret(variables);
}
public Minus(){}
public Minus(Expression leftExp,Expression rightExp){
this.leftExp=leftExp;
this.rightExp=rightExp;
} }
/**
* 变量
*/
class Variable implements Expression{
private String name;
@Override
public int interpret(Map<String, Expression> variables) {
if(variables==null) {return 0;}
return variables.get(name).interpret(variables);
}
public Variable(String name) {
this.name=name;
}
}

2、解释器:

package com.pat.Interpreter;

import java.util.Map;
import java.util.Stack;
/**
* 解释器,继承解释器规则类
* @author ZX
* 知识点补充
peek()与pop()
相同点:大家都返回栈顶的值。
不同点:peek 不改变栈的值(不删除栈顶的值),pop会把栈顶的值删除。
*/
public class Evaluator implements Expression{
private Expression syntaxTree; public Evaluator(String expression) {
if(expression==null||"".equals(expression)) {return;}
Stack<Expression> expreStack = new Stack<Expression>();
String[] tokens = expression.split(",");
for(String token:tokens) {
if("+".equals(token)) {
Expression subExpression = new Plus(expreStack.pop(),expreStack.pop());
expreStack.push(subExpression);
}else if("-".equals(token)) {
Expression subExpression = new Minus(expreStack.pop(),expreStack.pop());
expreStack.push(subExpression);
}else {
expreStack.push(new Variable(token));
}
}
syntaxTree=expreStack.pop();
} @Override
public int interpret(Map<String, Expression> variables) {
// TODO Auto-generated method stub
return syntaxTree.interpret(variables);
} }

3、测试类:

package com.pat.Interpreter;

import java.util.HashMap;
import java.util.Map; public class Test {
public static void main(String[] args) {
String expression = "w,x,z,-,+";
Evaluator eva = new Evaluator(expression);
Evaluator sentence = new Evaluator(expression);
Map<String,Expression> variables = new HashMap<String,Expression>();
variables.put("w", new Number(5));
variables.put("x", new Number(10));
variables.put("z", new Number(42));
//求5-10+42
int result = sentence.interpret(variables);
System.out.println(result);
}
}

4、结果:

//求5-10+42  》》》》37

最新文章

  1. 用原生js实现的链式调用函数
  2. C 工厂模式 还有其他的模式
  3. css3新属性@ text-shadow
  4. html5 canvas 笔记一(基本用法与绘制图形)
  5. WCF 配置终结点并调用服务
  6. Android 抓包,监控流量工具之 mitmproxy
  7. 页面开发辅助类—HtmlHelper初步了解
  8. 【转】视频H5 video最佳实践
  9. 【报错】java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[
  10. TF-IDF原理及使用
  11. js实现loading简单的遮套层
  12. C语言 &#183; 高精度乘法
  13. c语言时间计算
  14. CSS选择器-常用搜集
  15. golang-goroutine和channel
  16. Unity3d通用工具类之数据配置加载类
  17. Tow types of EF&#39;s default connection
  18. Retrofit学习笔记(一)
  19. ubuntu 开启PHP CURL支持
  20. 【Python数据分析】IPython基础

热门文章

  1. uwp - ContentDialog - 自定义仿iphone提示框,提示框美化
  2. Android TV开发总结(七)构建一个TV app中的剧集列表控件
  3. WPF程序加入3D模型
  4. Bootstrap Edit 使用方法
  5. ubuntu如何修改terminal终端的主机名(修改/etc/hostname文件)
  6. 【码云周刊第 22 期】GO :互联网时代的 C 语言!
  7. 所有语言的Awesome(2)
  8. Linux学习之“vfork函数”
  9. NULL指针区域(NULL定义为0-65535之间的任何数都可以)
  10. awk积累