博客
关于我
简单的介绍一下Java设计模式:解释器模式
阅读量:431 次
发布时间:2019-03-06

本文共 2513 字,大约阅读时间需要 8 分钟。

解释器模式是软件架构中的一个行为型模式,用于定义语言的文法表示,并提供解释句子的解释器,使客户端能够通过解释器解释语言中的句子。

解释器模式的意图

解释器模式的主要意图是为给定的语言定义其文法表示,并提供一个解释句子的解释器。这个解释器可以通过解释表达式来理解语言中的句子。

解释器模式的主要解决问题

解释器模式主要解决以下问题:对于一些固定文法,需要构建一个解释句子的解释器。

解释器模式的优缺点

优点:

  • 扩展性好,灵活
  • 方便增加新的解释表达式的方式
  • 实现简单文法较为容易
  • 缺点:

  • 使用场景较少
  • 处理复杂文法时维护难度较高
  • 会导致类膨胀
  • 采用递归调用方法,效率较低
  • 解释器模式的结构

    角色:

  • 抽象表达式(Expression)角色:声明所有表达式角色都需要实现的抽象接口,主要方法是interpret(解释操作)。
  • 终结符表达式(TerminalExpression)角色:具体实现抽象表达式接口的类,每个文法终结符对应一个具体终结表达式。
  • 非终结符表达式(NonterminalExpression)角色:为文法规则定义具体类,每个规则对应一个非终结符表达式类,解释操作通过递归调用子表达式解释。
  • 客户端(Client)角色:构建抽象语法树并调用解释操作。
  • 环境(Context)角色:提供解释器之外的一些全局信息,如变量的真实量值等。
  • 解释器模式的示例

    抽象表达式接口

    public abstract class Expression {    public abstract boolean interpret(Context ctx);    public abstract boolean equals(Object o);    public abstract int hashCode();    public abstract String toString();}

    终结符表达式示例:Constant

    public class Constant extends Expression {    private boolean value;    public Constant(boolean value) {        this.value = value;    }    @Override    public boolean interpret(Context ctx) {        return value;    }    @Override    public String toString() {        return new Boolean(value).toString();    }}

    非终结符表达式示例:And

    public class And extends Expression {    private Expression left, right;    public And(Expression left, Expression right) {        this.left = left;        this.right = right;    }    @Override    public boolean interpret(Context ctx) {        return left.interpret(ctx) && right.interpret(ctx);    }    @Override    public String toString() {        return "(" + left.toString() + " AND " + right.toString() + ")";    }}

    环境类

    public class Context {    private Map
    map = new HashMap<>(); public void assign(Variable var, boolean value) { map.put(var, new Boolean(value)); } public boolean lookup(Variable var) { Boolean value = map.get(var); return value != null ? value : false; }}

    客户端示例

    public class Client {    private static Context ctx;    private static Expression exp;        public static void main(String[] args) {        ctx = new Context();        Variable x = new Variable("x");        Variable y = new Variable("y");        Constant c = new Constant(true);        ctx.assign(x, false);        ctx.assign(y, true);        exp = new Or(new And(c, x), new And(y, new Not(x)));        System.out.println("x = " + x.interpret(ctx));        System.out.println("y = " + y.interpret(ctx));        System.out.println(exp.toString() + " = " + exp.interpret(ctx));    }}

    解释器模式的适用情况

  • 系统有一个简单的语言可供解释
  • 一些重复发生的问题可以用这种简单的语言表达
  • 效率不是主要考虑的问题
  • 转载地址:http://pliuz.baihongyu.com/

    你可能感兴趣的文章
    Openlayers高级交互(9/20):编辑图形(放缩、平移、变形、旋转),停止编辑
    查看>>
    Openlayers:DMS-DD坐标形式互相转换
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenLDAP(2.4.3x)服务器搭建及配置说明
    查看>>
    OpenLDAP编译安装及配置
    查看>>
    Openmax IL (二)Android多媒体编解码Component
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(二):GD32E23xx FreeRTOS移植
    查看>>
    OpenMCU(五):STM32F103时钟树初始化分析
    查看>>
    OpenMCU(四):STM32F103启动汇编代码分析
    查看>>
    OpenMetadata 命令执行漏洞复现(CVE-2024-28255)
    查看>>
    OpenMMLab | AI玩家已上线!和InternLM解锁“谁是卧底”新玩法
    查看>>
    OpenMMLab | S4模型详解:应对长序列建模的有效方法
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenMMLab | 不是吧?这么好用的开源标注工具,竟然还有人不知道…
    查看>>
    OpenMMLab | 如何解决大模型长距离依赖问题?HiPPO 技术深度解析
    查看>>
    OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
    查看>>
    OpenMP 线程互斥锁
    查看>>