美文网首页
解释器模式

解释器模式

作者: 打工养老板 | 来源:发表于2019-10-18 09:12 被阅读0次

解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。

解释器模式是一种类行为型模式,其主要优点如下。
扩展性好。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。
容易实现。在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。

解释器模式的主要缺点如下。
执行效率较低。解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢,且代码的调试过程也比较麻烦。
会引起类膨胀。解释器模式中的每条规则至少需要定义一个类,当包含的文法规则很多时,类的个数将急剧增加,导致系统难以管理与维护。
可应用的场景比较少。在软件开发中,需要定义语言文法的应用实例非常少,所以这种模式很少被使用到。

/**
 * 抽象表达式(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
 * 终结符表达式(Terminal    Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。
 * 非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
 * 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。
 * 客户端(Client):主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,当然也可以通过环境角色间接访问解释器的解释方法。
 */
public class InterpreterPattern {
    public static void main(String[] args) {
        Context bus = new Context();
        bus.freeRide("深圳的老人");
        bus.freeRide("深圳的年轻人");
        bus.freeRide("广州的妇女");
        bus.freeRide("广州的儿童");
        bus.freeRide("山东的儿童");
    }
}

/**
 * 抽象表达式类
 */
interface Expression {
    //解释方法
    public boolean interpret(String info);
}

/**
 * 终结符表达式类
 */
class TerminalExpression implements Expression {
    private Set<String> set = new HashSet<String>();

    public TerminalExpression(String[] data) {
        for (int i = 0; i < data.length; i++) set.add(data[i]);
    }

    public boolean interpret(String info) {
        return set.contains(info);
    }
}

/**
 * 非终结符表达式类
 */
class AndExpression implements Expression {
    private Expression city = null;
    private Expression person = null;

    public AndExpression(Expression city, Expression person) {
        this.city = city;
        this.person = person;
    }

    public boolean interpret(String info) {
        String s[] = info.split("的");
        return city.interpret(s[0]) && person.interpret(s[1]);
    }
}

/**
 * 环境类
 */
class Context {
    private String[] citys = {"深圳", "广州"};
    private String[] persons = {"老人", "妇女", "儿童"};
    private Expression cityPerson;

    public Context() {
        Expression city = new TerminalExpression(citys);
        Expression person = new TerminalExpression(persons);
        cityPerson = new AndExpression(city, person);
    }

    public void freeRide(String info) {
        boolean ok = cityPerson.interpret(info);
        if (ok) System.out.println("您是" + info + ",您本次乘车免费!");
        else System.out.println(info + ",您不是免费人员,本次乘车扣费2元!");
    }
}

上一篇:备忘录模式
腾讯云双十一优惠链接

相关文章

  • 第5章 -行为型模式-解释器模式(终)

    一、解释器模式的简介 二、解释器模式的优缺点 三、解释器模式的实例

  • 17.解释器模式(行为型)

    解释器模式(行为型) 解释器模式很难学,使用率很低! 一、相关概念 1). 解释器模式概述 解释器模式是一种使用频...

  • 解释器模式

    一、解释器模式介绍 二、解释器模式代码实例

  • 解释器模式

    解释器模式 解释器模式的定义 解释器模式(Interpreter Pattern)是一种按照规定语法进行解析的方案...

  • 行为型模式:解释器模式

    原文首发:行为型模式:解释器模式 十一大行为型模式之十:解释器模式。 简介 姓名 :解释器模式英文名 :Inter...

  • 折腾Java设计模式之解释器模

    解释器模式 解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器...

  • 设计模式[22]-解释器模式-Interpreter Patte

    1.解释器模式简介 解释器模式(Interpreter Pattern)模式是行为型(Behavioral)设计模...

  • 解释器模式

    今天和大家分享的模式是解释器模式。 首先介绍一下解释器模式适合解决哪类问题。 其实,解释器模式需要解决的问题是,如...

  • 解释器模式

    1. 解释器模式 1.1 定义: 解释器模式(Interpreter) : 定义一种文法的表示,并定义一种解释器...

  • 设计模式解释器模式

    解释器模式的定义 解释器模式 (Interpreter Pattern):定义一个语言的文法,并且建立一个解释器来...

网友评论

      本文标题:解释器模式

      本文链接:https://www.haomeiwen.com/subject/sscvmctx.html