[设计模式] 行为型:解释器模式(Interpreter Pattern)

什么是解释器模式

解释器模式就是针对一个有规则的场景,设计一个解释器,根据定好的规则解释具体场景并得到结果的设计模式。

设计一段代码,能够计算任意的加减乘除混合运算,那么这就是一个解释器。

侧重业务系统架构与开发的码农,使用解释器模式的场景比较少,工作中几乎不会遇到,该模式可以不做了解,直接跳过不用再看了。

解释器模式不同于以往的各种模式,不同之处不在于代码层面,而在思想层面。

以前说的二十二种设计模式,侧重点都是围绕着很有代表性的业务场景,设计出高内聚低耦合易扩展的解决方案,并用代码巧妙的实现。

解释器模式的侧重点稍有不同,它是围绕着业务场景,设计通用的业务规则,业务场景的具体解决方案反而不太关注。

举个例子来理解,金融领域涉及货币的流通,必然会有各种关于货币的计算模型,比如利息、罚息、贷款、等等的计算。

解释器模式不关注种类繁多的货币计算模型,它更关注计算规则!什么是规则?就是加减乘除等各种数学运算规则。设计这些规则并实现,就是解释器模式的用武之地。

当然,在现实业务场景中,数学运算规则早已有很多实现好的功能完善的类库可供使用,无需我们再造轮子。我想表达的意思就是,解释器模式适用于规则的制定、解释,还有实现,关注的是业务场景更底层的东西。

设计与实现

规则设计

解释器模式定义的是规则与实现,那么对于规则本身来讲,就应该有两个要点。

规则的语法

语法就是规则的表达方式。

比如,加法规则的表达方式就是a + b,其中a、b是数字变量,+是加法符号。

再比如,乘法规则的表达方式是a * b,其中a、b是数字变量,*是乘法符号。

加法和乘法同时存在的时候,还要定义个运算优先级,否则会出现运算歧义。都知道的,乘法优先级高于加法。

语法的解析

语法是规则的最小单元,多个语法混合搭配使用就能形成复杂的业务场景,比如定义a + b * c这么一个场景,其中就包含加法和乘法两个语法规则。

语法解析就是针对给定的场景,将其按规则拆解运算,得到最终的计算结果。

对于a + b * c来说,就需要先计算*再计算+得出结果。

代码实现

实现这么一个业务场景:计算正整数范围的加法和乘法运算,语法输入规则只能包含正整数和加法乘法符号,不能含有空格等其它字符。

代码实现大致可以这样:

// 解释器:解析正整数范围内,只含加法和乘法的运算
public class Interpreter {
    /**
     * example:
     * expression = "1+2+3+4"
     * expression = "1*2*3*4"
     * expression = "1+2*3*4"
     *
     * @param expression
     * @return
     */
    public int interpret(String expression) {
        List<String> nums = new ArrayList<>(), symbols = new ArrayList<>();

        nums.addAll((Arrays.asList(expression.split("[+|*]"))));
        symbols.addAll(Arrays.asList(expression.split("\\d+")));
        symbols.remove(0);

        for (int i = 0; i < symbols.size(); i++) {
            String symbol = symbols.get(i);
            if ("*".equals(symbol)) {
                int num1 = Integer.valueOf(nums.get(i));
                int num2 = Integer.valueOf(nums.get(i + 1));
                nums.set(i, null);
                nums.set(i + 1, String.valueOf(num1 * num2));
            }
        }

        int sum = 0;
        for (String num : nums) sum += num == null ? 0 : Integer.valueOf(num);

        return sum;
    }
}

// 测试方法
public static void main(String[] args) {
    String expression = "1*2*3+4";
    Interpreter interpreter = new Interpreter();
    int sum = interpreter.interpret(expression);
    System.out.println(sum);
}

这个解释器非常非常的简单,只能做个示例。

实际当中,如果规则非常多且复杂,那么设计解释器的时候,通常还会穿插应用其它的设计模式,使其内部的设计更为合理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释器模式Interpreter Pattern)是一种行为设计模式,它定义了一种语言文法的表示,并定义了一个解释器,用于解释语言中的句子。它将一个问题分成两个部分:一部分是语言的文法规则,另一部分是解释器,用来解释规则中的句子。解释器模式可以用于处理一些简单的语言,如数学表达式、正则表达式等。 实现方式: 1. 定义抽象表达式类(AbstractExpression),它是所有表达式类的父类,声明了抽象的解释方法。 2. 定义终结符表达式类(TerminalExpression),它实现了抽象表达式类中的解释方法,用于解释语言中的终结符。 3. 定义非终结符表达式类(NonterminalExpression),它也实现了抽象表达式类中的解释方法,用于解释语言中的非终结符。 4. 定义上下文类(Context),它包含了解释器需要的一些全局信息。 5. 客户端使用时,先创建一个上下文对象,然后将需要解释的语言句子作为参数传入解释器对象中,解释器对象将句子解释成相应的结果。 优点: 1. 可扩展性好,增加新的文法规则只需要添加相应的非终结符表达式类即可。 2. 易于实现语法分析。 缺点: 1. 对于复杂的文法规则解释器模式的类数量可能会很大,增加程序的复杂性。 2. 执行效率较低,因为需要递归调用解释器对象。 适用场景: 1. 可以用于处理一些简单的语言,如数学表达式、正则表达式等。 2. 当语言的文法规则比较复杂时,可以使用解释器模式进行语法分析。 3. 当需要对语言进行增强时,可以使用解释器模式添加新的文法规则

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值