暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

设计模式系列--解释器模式

TC 谈 2020-11-27
455

定义

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

在解释器模式中由于语法是由很多类表示的,当语法规则更改时,只需修改相应的非终结符表达式即可;若扩展语法时,只需添加相应非终结符类即可。

特征:为了解释一种语言,而为语言创建的解释器。

实现

给出一个运算表达式,根据解释器模式计算出相应的结果

类结构图

数字计算解释器接口 IArithmeticInterpreter

public interface IArithmeticInterpreter {
    int interpret();
}

解释器统一抽象类 Interpreter

public abstract class Interpreter implements IArithmeticInterpreter {

    protected IArithmeticInterpreter left;
    protected IArithmeticInterpreter right;

    public Interpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {
        this.left = left;
        this.right = right;
    }

}

加法解释器 AddInterpreter

public class AddInterpreter extends Interpreter {
    public AddInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {
        super(left, right);
    }

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

减法解释器 SubInterpreter

public class SubInterpreter extends Interpreter {
    public SubInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {
        super(left, right);
    }

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

乘法解释器 MultiInterpreter

public class MultiInterpreter extends Interpreter {
    public MultiInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {
        super(left, right);
    }

    @Override
    public int interpret() {
        return this.left.interpret() * this.right.interpret();
    }
}

除法解释器 DivInterpreter

public class DivInterpreter extends Interpreter {
    public DivInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {
        super(left, right);
    }

    @Override
    public int interpret() {
        return this.left.interpret() / this.right.interpret();
    }
}

数字值解析器 NumInterpreter

public class NumInterpreter implements IArithmeticInterpreter {

    private int value;

    public NumInterpreter(int value{
        this.value = value;
    }

    @Override
    public int interpret(
{
        return this.value;
    }
}

计算器入口 SelfCalculator

public class SelfCalculator {

    private Stack<IArithmeticInterpreter> stack = new Stack<>();
    public SelfCalculator(String expression) {
        parse(expression);
    }

    private void parse(String expression) {
        String[] elements = expression.split(" ");
        IArithmeticInterpreter left, right;
        for (int i = 0; i < elements.length; i++) {
            String operator = elements[i];
            if (OperatorUtil.ifOperator(operator)) {
                left = this.stack.pop();
                right = new NumInterpreter(Integer.valueOf(elements[++i]));
                System.out.println("出栈" + left.interpret() + "和" + right.interpret());
                this.stack.push(OperatorUtil.getInterpreter(left, right, operator));
                System.out.println("应用运算符:" + operator);
            } else {
                NumInterpreter numInterpreter = new NumInterpreter(Integer.valueOf(elements[i]));
                stack.push(numInterpreter);
                System.out.println("入栈:" + numInterpreter.interpret());
            }
        }

    }

    public int calculate() {
        return this.stack.pop().interpret();
    }
}

操作符工具类 OperatorUtil

public class OperatorUtil {
    public static boolean ifOperator(String symbol{
        return symbol.equals("+") || symbol.equals("-") || symbol.equals("*") || symbol.equals("/");
    }

    public static Interpreter getInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right,String symbol{
        if (symbol.equals("+")) {
            return new AddInterpreter(left, right);
        } else if (symbol.equals("-")) {
            return new SubInterpreter(left, right);
        } else if (symbol.equals("*")) {
            return new MultiInterpreter(left, right);
        } else if (symbol.equals("/")) {
            return new DivInterpreter(left, right);
        }
        return null;
    }
}

测试 Test

public class Test {
    public static void main(String[] args) {
        String expression = "10 + 40 - 20";
        int resultCalculate = new SelfCalculator(expression).calculate();
        System.err.println("表达式:" + expression);
        System.err.println("计算结果:"+resultCalculate);
    }
}





《  完  》




文章转载自TC 谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论