设计模式-解释器模式(Interpreter)
解释器模式是行为型模式的一种。给定一个语言(如由abcdef六个字符组成的字符串集合),定义它的文法的一种表示(S::=abA*ef,A::=cd)并定义一个解释器,解释器使用该表示来解释语言中的句子.其中的解释器类似一个翻译机
角色和职责:
1.抽象解释器(AbstractExpression):
维护对行为实现(Implementor)的引用
2.终结符解释器(TerminalExpression) -AddExpression:
3.非终结符解释器(NonterminalExpression)-NumberExpression:
4.上下文环境(Context):
UML图:

具体代码:
/**
* 抽象解释器
*/
public interface AbstractExpression {
int interptet();//处理
}
/**
* 数字类
*/
public class NumberExpression implements AbstractExpression{
private int number;
public NumberExpression(int number){
this.number = number;
} @Override
public int interptet() {
return number;
}
}
/**
* 运算类
*/
public class AddExpression implements AbstractExpression{
private AbstractExpression expression1;
private AbstractExpression expression2;
public AddExpression(AbstractExpression expression1,AbstractExpression expression2){
this.expression1 = expression1;
this.expression2 = expression2;
} @Override
public int interptet() {
return expression1.interptet() + expression2.interptet();
}
}
import java.util.Stack; /**
* 上下文,解释器
*
*/
public class Context {
Stack<AbstractExpression> stack = new Stack<AbstractExpression>();
public Context(String str){
String strs[] = str.split(" ");
for(int i=0;i<strs.length;i++){
switch (strs[i]){
case "+":
AbstractExpression number1 = stack.pop();
AbstractExpression number2 = new NumberExpression(Integer.parseInt(strs[++i]));
stack.push(new AddExpression(number1,number2));
break;
default:
stack.push(new NumberExpression(Integer.parseInt(strs[i])));
break;
}
}
} public int calculate(){
return stack.pop().interptet();//计算结果
}
}
public class Main {
public static void main(String[] args) {
Context context = new Context("22 + 33 + 44");
int result = context.calculate();//计算结果
System.out.println("计算结果:"+result);
}
}
结果:
计算结果:99
优缺点:
优:灵活性强,如上边的例子,当我们想对文法规则进行扩展延伸时,只需要增加相应的非终结符解释器,并在构建语法树的时候使用新增的解释器对象进行具体的解释即可.
缺:因为每一条文法都可以对应至少一个解释器,会生成大量的类,导致后期维护困难,而且对应复杂的文法,构建语法树会显得异常繁琐.
源码地址:https://github.com/qjm201000/design_pattern_interpreter.git
设计模式-解释器模式(Interpreter)的更多相关文章
- javascript设计模式 - 解释器模式(interpreter)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 大话设计模式--解释器模式 interpreter -- C++实现实例
1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...
- C#设计模式——解释器模式(Interpreter Pattern)
一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...
- 设计模式:解释器模式(Interpreter)
为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...
- 深入浅出设计模式——解释器模式(Interpreter Pattern)
模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题.解释器模式描述了如何构成一个 ...
- 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)
原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...
- 解释器模式 Interpreter 行为型 设计模式(十九)
解释器模式(Interpreter) 考虑上图中计算器的例子 设计可以用于计算加减运算(简单起见,省略乘除),你会怎么做? 你可能会定义一个工具类,工具类中有N多静态方法 比如定义了两个 ...
- C#设计模式:解释器模式(Interpreter Pattern)
一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易 ...
- 二十四种设计模式:解释器模式(Interpreter Pattern)
解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...
- JAVA 设计模式 解释器模式
用途 解释器模式 (Interpreter) 定义一个语言,定义它的文法的一种表示. 并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式是一种行为型模式. 结构
随机推荐
- 【LeetCode】LRU Cache 解决报告
插话:只写了几个连续的博客,博客排名不再是实际"远在千里之外"该.我们已经进入2一万内. 再接再厉.油! Design and implement a data structure ...
- 就服务器项目部署debug谈谈自己的感受
前言 学校小组Project那些外国人啥也不会, 基本上我一个人全包了前端和后端, 说实话这些天来也感受到了写一个比较拿得出手的web确实也不是这么容易的, 特别是我没什么项目经验, 很多时候碰到问题 ...
- WPF Binding Path妙用代码实现
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- 基于IdentityServer4的单点登录——IdentityServer
1.新建项目并添加引用 新建一个asp .net core 2.0的项目引用IdentityServer4.AspNetIdentity 2.定义资源 新建Config.cs文件,定义Api资源与Id ...
- JAVASCRIPT高程笔记-------第十章 DOM对象
10.1.1 node类型 --除IE外 所有浏览器都可以访问到这个类型 :JS中所有的节点类型都继承自Node类型 nodeName 与nodeValue 如果是一个元素 那么nodeName中保 ...
- CSS,让100%的宽度,自动减10,让100%的高度,自动减10,可以加减乘除
CSS,让100%的宽度,自动减10,让100%的高度,自动减10,可以加减乘除 实例: .add{ width: calc(100% - 10px); height: calc(100% - 10p ...
- GIS基础软件及操作(六)
原文 GIS基础软件及操作(六) 练习六.空间分析的应用 1.加深对缓冲区分析基本原理.方法的认识:2.熟练掌握距离制图创建缓冲区技术方法.3.掌握利用缓冲区分析方法解决地学空间分析问题的能力. 1. ...
- 微信小程序把玩(三十一)wx.uploadFile(object), wx.downloadFile(object) API
原文:微信小程序把玩(三十一)wx.uploadFile(object), wx.downloadFile(object) API 反正我是没有测通这两个API!!!!不知道用的方式不对还是其他的!! ...
- 中资收购美新半导体,为何能通过CFIUS审查(其实是国内公司,技术水平国内领先,和国际仍有差距)
日前,华灿光电发布公告称,旗下子公司和谐光电收购美国美新半导体终获得CFIUS审查通过.这是中资收购豪威科技.图芯科技等公司之后,再次从美国成功收购半导体企业.而且本次中资收购美新半导体还是在特朗普上 ...
- Android零基础入门第30节:两分钟掌握FrameLayout帧布局
原文:Android零基础入门第30节:两分钟掌握FrameLayout帧布局 前面学习了线性布局.相对布局.表格布局,那么本期来学习第四种布局--FrameLayout帧布局. 一.认识FrameL ...