23种常用设计模式-解释器(Interpreter)模式

327次阅读
没有评论

共计 2687 个字符,预计需要花费 7 分钟才能阅读完成。

内容目录

解释器模式

概述

 解释器(Interpreter Pattern)模式:给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

在实际开发中几乎不需要自定义解释器,一个完整的解释器模式是十分复杂的。

概述

 解释器模式属于行为型模式。

介绍

  • 目的:给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
  • 主要解决:对于一些固定文法构建一个解释句子的解释器。
  • 使用场景:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

示例代码

 因为一个完整的解释器模式比较复杂,因此这里选择汉语的十以内加减法的实现。例如输入"一加一",则会输出2等。

Expression接口

 Expression定义了表达式的相关接口,这里定义了一个解释方法,它会返回表达式的解释结果。

package interpreter;

public interface Expression {
    int interpreter();
}

Number类

 Number是数字类的具体解释类,它会将十以内的汉字转换为阿拉伯数字。

package interpreter;

public class Number implements Expression{
    private int number;

    public Number(char word){
        switch (word) {
            case '零':
                number = 0;
                break;
            case '一':
                number = 1;
                break;
            case '二':
                number = 2;
                break;
            case '三':
                number = 3;
                break;
            case '四':
                number = 4;
                break;
            case '五':
                number = 5;
                break;
            case '六':
                number = 6;
                break;
            case '七':
                number = 7;
                break;
            case '八':
                number = 8;
                break;
            case '九':
                number = 9;
                break;
            default:
                break;
        }
    }

    @Override
    public int interpreter() {
        return number;
    }
}

Operator抽象类

 Operator抽象类用于定义加减操作的相同部分,对于加减运算,依据运算符进行划分,它有左边和右边两个字符。

package interpreter;

public abstract class Operator implements Expression {
    Expression left;
    Expression right;
    Operator(Expression left,Expression right){
        this.left = left;
        this.right = right;
    }
}

Add类

 Add类是加法的具体解释类。它实现了汉语加法运算。

package interpreter;

public class Add extends Operator{
    Add(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter() {
        return left.interpreter() + right.interpreter();
    }
}

Sub类

 Sub类是减法的具体解释类。它实现了汉语减法运算。

package interpreter;

public class Sub extends Operator{
    Sub(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter() {
        return left.interpreter() - right.interpreter();
    }
}

Calculator类

 Calculator是计算类,它实现了基于Add和Sub的复杂计算操作。实现操作使用了栈这一数据结构。

package interpreter;

import java.util.Stack;

public class Calculator {
    public int calculator(String expression){
        Stack<Expression> stack = new Stack<>();
        for (int i = 0; i < expression.length(); i++) {
            char word = expression.charAt(i);
            switch (word){
                case '加':
                    stack.push(new Add(stack.pop(),new Number(expression.charAt(++i))));
                    break;
                case '减':
                    stack.push(new Sub(stack.pop(),new Number(expression.charAt(++i))));
                    break;
                default:
                    stack.push(new Number(word));
                    break;
            }
        }
        return stack.pop().interpreter();
    }
}

 测试代码及运行结果如下:

package interpreter;

import org.junit.Test;

public class InterpreterTest {
    @Test
    public void interpreterTest(){
        String expression1 = "一加一";
        String expression2 = "四加二减一";
        Calculator calculator = new Calculator();
        int calculator1 = calculator.calculator(expression1);
        int calculator2 = calculator.calculator(expression2);
        System.out.println(expression1 + "等于" + calculator1);
        System.out.println(expression2 + "等于" + calculator2);
    }
}
一加一等于2
四加二减一等于5

其它

 解释器模式的可利用场景比较少,JAVA 中如果碰到可以用 expression4J 代替。

正文完
 
PG Thinker
版权声明:本站原创文章,由 PG Thinker 2023-10-22发表,共计2687字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
热评文章
Rust中所有权与借用规则概述

Rust中所有权与借用规则概述

在GC与手动管理内存之间,Rust选择了第三种:所有权机制...