目录

  • 前言
  • 1 定义
  • 2 适用性
  • 3 结构
    • 3.1 结构图
    • 3.2 参与者
  • 4 应用举例
    • 4.1 定义Context
    • 4.2 Interpreter定义
    • 4.3 具体解释器ValueInterpreter、AndInterpreter和OrInterpreter
      • 4.3.1 ValueInterpreter
      • 4.3.2 AndInterpreter
      • 4.3.3 OrInterpreter
    • 4.4 Client
  • 5 总结
  • 参考文献

前言

当一个特定类型的问题发生的概率很高,那么可以将该问题解释为简单的表达式,这样我们定义一个解释器,处理这一类型问题,如正则表达式。

1 定义

Interpreter解释器模式:给定一个语言,定义它的文法的表示,给定一个解释器,该解释器负责使用该表达式解析该语言。

2 适用性

当有一个语言需要解释执行,并且可以将该语言抽象为一个语法树时,可以使用解释器处理该语言。

3 结构

3.1 结构图

解释器模式结构图:

3.2 参与者

  • Client:负责初始化Context,调用解释器执行给定语句。
  • Context:上下文,负责解释器以外的内容存储和处理。作为外部状态传递给解释器。
  • AbstractExpression:抽象解释器,顶级接口,定义一个解释方法,传入上下文。
  • TerminalExpression:终结符表达式,不存在子表达式,类似于树的叶子节点,通常依赖context处理具体解释过程。
  • NotTerminalExpression:非终结符表达式,一般还有子表达式,类似于树的非叶子节点

协作过程为,Client构建一个语句并初始化上下文,将该上下文作为参数传入语句中,后续按照抽象语法树进行处理。

4 应用举例

自定义一个Boolean表达式解释器,包括解释器Interpreter接口和具体实现AndInterpreter和OrInterpreter,上下文Context,和测试Client。

4.1 定义Context

定义如下:

/**
*上下文定义
*/
public class Context {Map<String, Boolean> contextMap = new HashMap<>();public boolean lookUp(String str) {if (contextMap.containsKey(str)) {return contextMap.get(str);}return  false;}public void assgin(String key, boolean value) {if (contextMap.containsKey(key)) {return;}contextMap.put(key, value);}
}

该上下文负责存储和处理终结符表达式。

4.2 Interpreter定义

定义如下:

/*** 解释器顶级接口,定义解释方法和入参context*/
public interface Interpreter {boolean interpreter(Context context);
}

主要定义解释器处理方法和入参。

4.3 具体解释器ValueInterpreter、AndInterpreter和OrInterpreter

4.3.1 ValueInterpreter

定义如下:

/*** 终结符表达式,自定义字符串*/
public class ValueInterpreter implements Interpreter{private String valueStr;public ValueInterpreter(String valueStr) {this.valueStr = valueStr;}@Overridepublic boolean interpreter(Context context) {return context.lookUp(valueStr);}
}

主要是通过context的lookUp处理表达式,这里进行了简单化,只是查找操作。

4.3.2 AndInterpreter

定义如下:

/*** 与解释器,负责and解析*/
public class AndInterpreter implements Interpreter{private Interpreter left;private Interpreter right;public AndInterpreter(Interpreter left, Interpreter right) {this.left = left;this.right = right;}@Overridepublic boolean interpreter(Context context) {return left.interpreter(context) && right.interpreter(context);}
}

定义and解释的两个遍历left和right,通过递归处理left和right解释操作,并使用&& 返回解释结果。

4.3.3 OrInterpreter

定义如下:

/*** 或解释器,负责or解释*/
public class OrInterpreter implements Interpreter{private Interpreter left;private Interpreter right;public OrInterpreter(Interpreter left, Interpreter right) {this.left = left;this.right = right;}@Overridepublic boolean interpreter(Context context) {return left.interpreter(context) || right.interpreter(context);}
}

类似and解释,递归处理left和right,并使用|| 返回解释结果。

4.4 Client

定义如下:

/*** 定义Clent测试程序*/
public class Client {public static void main(String[] args) {Context context = new Context();context.assgin("12233", true);context.assgin("123", false);//对应表达式:(false or true) and (true and false) = falseInterpreter interpreter = new AndInterpreter(new OrInterpreter(new ValueInterpreter("123"), new ValueInterpreter("12233")), new AndInterpreter(new ValueInterpreter("12233"), new ValueInterpreter("123")));System.out.println(interpreter.interpreter(context));}
}

运行结果如下:

通过解释表达式(false or true) and (true and false) 来验证解释器。

5 总结

该模式主要适合语法简单、使用频率高的情况。

参考文献

[1]. 《设计模式》

设计模式——Interpreter解释器模式相关推荐

  1. 设计模式之解释器模式(Interpreter)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  2. 北风设计模式课程---解释器模式(Interpreter Pattern)

    北风设计模式课程---解释器模式(Interpreter Pattern) 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用 ...

  3. python实现解释器_Python设计模式之解释器模式

    解释器模式 对每个应用来说,至少有以下两种不同的用户分类. 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就足够了. 高级用户:这些用户, ...

  4. 浅谈Interpreter解释器模式

    一.前言 这是我们23个设计模式中最后一个设计模式了,大家或许也没想到吧,竟然是编译原理上的编译器,这样说可能不对,因为编译器分为几个部分组成呢,比如词法分析器.语法分析器.语义分析器.中间代码优化器 ...

  5. java 设计模式之解释器模式(十九)

    java 设计模式之解释器模式①⑨ 定义 角色分析 使用场景 代码实现 躁动的心灵,不安的灵魂.在彷徨中挣扎,在迷失中探索.时光飞逝,努力不变. 设计模式学习,近期我会把23种设计模式都写成博客,敬请 ...

  6. 设计模式:解释器模式(Interpreter)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. 行为型设计模式之解释器模式(Interpreter)

    结构 意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 适用性 当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用 ...

  8. 设计模式 笔记 解释器模式 Interpreter

    //---------------------------15/04/26---------------------------- //Interpreter 解释器模式----类行为型模式 /* 1 ...

  9. 设计模式复习-解释器模式

    #pragma once #include "stdafx.h" #include<map> #include<set> #include<list& ...

  10. Android设计模式之——解释器模式

    一.介绍 解释器模式(Interpreter Pattern)是一种用的比较少的行为型模式,其提供了一种解释语言的语法或表达式的方式,该模式定义了一个表达式接口,通过该接口解释一个特定的上下文.在这么 ...

最新文章

  1. Coronascape – 为COVID-19研究特制的基因列表比较工具
  2. TLS 改变密码标准协议(Change Cipher Spec Protocol) 就是加密传输中每隔一段时间必须改变其加解密参数的协议...
  3. 【数字信号处理】相关函数 ( 功率信号 | 功率信号的互相关函数 | 功率信号的自相关函数 )
  4. Visual Studio 2008 每日提示(三十二)
  5. java mvp开发_如何从没有软件开发技能的想法变成现实的市场MVP?️?
  6. java redis 重连_突破Java面试(23-4) - Redis 复制原理
  7. html5画电池状态,HTML5的一个显示电池状态的API简介
  8. Linux Kernel 2.4 Internals
  9. body标签子级被默认client width截断的解决方法
  10. 西威SIEI电梯变频器维修图纸
  11. win7计算机重启遇到错误,安装Win7系统过程出现计算机意外地重新启动或遇到错误提示的解决方法...
  12. 阿里云搭建MQTT物联网服务器
  13. MCSE 2012之应用程序控制策略AppLocker
  14. 魔数湖南大学程序设计作业
  15. 时间加减计算器_初级会计职称考试不让带计算器?!手把手教你使用机考系统计算器,再不看就晚了!...
  16. hexo个人博客搭建(二)butterfly主题配置
  17. 云计算实战:Amazon EC2之初体验
  18. 佟大为新任《非诚》嘉宾 极力反对异地恋
  19. CF 704A Thor
  20. 最新成果展示:Ga2O3-SBD计算模型

热门文章

  1. 浮点数开方运算的快速计算
  2. 学生用计算机计算分数,Excel案例(十三)——学生计算机成绩表
  3. java合并图片合成多张横向或竖向
  4. 第一次电话面试失败之后
  5. @ 剑指offer(python)最小的k个数
  6. 玩转数据可视化之R语言ggplot2:(四)单一基础几何图形绘制
  7. 用python背单词_还在用背单词App?使用Python开发英语单词自测工具,助你逆袭单词王!...
  8. C++将一个cpp文件中的变量应用到另一个cpp文件中
  9. Parameterize Method(令函数携带参数)
  10. Mac 判断终端是否走了代理服务器的方法