解释器模式(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

【设计模式】行为型11解释器模式(Interpreter Pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

    原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...

  2. C#设计模式:解释器模式(Interpreter Pattern)

    一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易 ...

  3. 二十四种设计模式:解释器模式(Interpreter Pattern)

    解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...

  4. C#设计模式——解释器模式(Interpreter Pattern)

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

  5. 原始的解释器模式(Interpreter Pattern)

    解释器模式的定义(现实项目中非常少遇到,因此直接理论先...) 解释器模式是一种依照规定语法进行解析的方案,在如今项目中使用较少,其定义为:给定一门语言,定义它的方法的一种表示,并定义一个解释器,该解 ...

  6. php解释器模式( interpreter pattern)

    ... <?php /* The interpreter pattern specifies how to evaluate language grammar or expressions. W ...

  7. 十一个行为模式之解释器模式(Interpreter Pattern)

    定义: 定义一个语言的文法,可以使用一个解释器来解释其文法.定义终结符和非终结符的统一接口,并使用抽象对象建立非终结符与其它元素的关联. 结构图: AbstractExpression:抽象表达式类, ...

  8. 解释器模式 Interpreter 行为型 设计模式(十九)

      解释器模式(Interpreter)   考虑上图中计算器的例子 设计可以用于计算加减运算(简单起见,省略乘除),你会怎么做?    你可能会定义一个工具类,工具类中有N多静态方法 比如定义了两个 ...

  9. Java设计模式(17)解释器模式(Interpreter模式)

    Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...

随机推荐

  1. 《The Economist》的阅读

    cover story(封面故事): Clean energy's dirty secret:清洁能源的肮脏幕后: 0. 词汇 respite:n. 缓解:暂缓:暂时的休息:缓期执行:也作及物动词(v ...

  2. ORACLE 11G在相同的linuxserver从实施例1满库到实例2上

    早期的导出命令: [root@powerlong4 ~]# su - oracle [oracle@powerlong4 ~]$ export ORACLE_SID=pt1; [oracle@powe ...

  3. WPF C#之读取并修改App.config文件

    原文:WPF C#之读取并修改App.config文件 简单介绍App.config App.config文件一般是存放数据库连接字符串的.  下面来简单介绍一下App.config文件的修改和更新. ...

  4. Nancy Web框架

    原文 Nancy Web框架 Nancy框架 一.创建第一个Nancy应用 二.探索Nancy的module 1. 模块能够在全局被发现 2. 使用模块为路由创建一个根 三.定义路由 1. 方法 2. ...

  5. javascript真假(true/false)值

    下面列出的值被当做假(false): false null undefined 空字符串 ' ' 数字 0 数字 NaN $(document).ready(function(){ var array ...

  6. Android基础开发入门(一)

    前言:我学了一年多的C#(从学编程算起,也没有两年,我现在大二下),中间也一直在学WP开发,虽然技术不咋地,很渣渣,但微软在Build大会上宣布的策略让我觉得有必要学习一下安卓开发了.关于微软的策略, ...

  7. Win10《芒果TV》更新v3.4.10春光版:优化弹窗体验,修复热键和推送

    春来触地故乡情,忽见风光忆两京,金谷踏花香骑入,曲江碾草钿车行,Win10版<芒果TV>更新v3.4.10,进一步优化弹窗体验,修复热键和推送异常. Win10版<芒果TV>V ...

  8. SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步

    原文:SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步 由于之前的需要,禁止了复制架构更改,以至在发布中添加一个字段,并不会同步到订阅中,而现在又在订阅中添加了一个同名 ...

  9. 将多个文本文件内的数据导入到Datagridview

    private BindingList listXSxxInfoList = new BindingList(); openFileDialog1.Multiselect = true;//允许选择多 ...

  10. VS2015设置VS2017的“快速操作”快捷键Alt+Enter

    选项 -  环境 - 键盘 - 视图.快速操作和重构 添加“Alt+Enter (文本编辑器)”