解释器模式

这是设计模式最后一篇,迟迟没有写。听到这个名字可能会想到解释型语言,学习编译倒也可以参考一下这个。这个在实际工作中用的很少,直接上实现加减乘除的代码吧

public class Interpreter {
    interface Expression {
        int interpret(Context context);
    }

    //终结符表达式(Terminal Expression)
    static class Constant implements Expression {
        private int i;

        public Constant(int i) {
            this.i = i;
        }

        @Override
        public int interpret(Context context) {
            return i;
        }
    }

    static class Variable implements Expression {
        @Override
        public int interpret(Context context) {
            return context.LookupValue(this);
        }
    }

    //非终结符表达式(Nonterminal Expression)
    static class Add implements Expression {
        private Expression left, right;

        public Add(Expression left, Expression right) {
            this.left = left;
            this.right = right;
        }

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

    static class Sub implements Expression {
        private Expression left, right;

        public Sub(Expression left, Expression right) {
            this.left = left;
            this.right = right;
        }

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

    static class Mul implements Expression {
        private Expression left, right;

        public Mul(Expression left, Expression right) {
            this.left = left;
            this.right = right;
        }

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

    static class Div implements Expression {
        private Expression left, right;

        public Div(Expression left, Expression right) {
            this.left = left;
            this.right = right;
        }

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

    //环境(Context)角色,保存一些值
    static class Context {
        private Map valueMap = new HashMap<>();

        public void addValue(Variable x, int y) {
            valueMap.put(x, y);
        }

        public int LookupValue(Variable x) {
            return (int) valueMap.get(x);
        }
    }

    public static void main(String[] args) {
        Context context = new Context();
        Variable a = new Variable();
        Variable b = new Variable();
        Constant c = new Constant(15000);
        context.addValue(a, 14);
        context.addValue(b, 10000);

        Expression expression =  new Add(new Sub(c, b), a);
        System.out.println("Result = " + expression.interpret(context));
    }
}
输出:
Result = 5014

核心就两个:环境对象、表达式。写完了,很多地方思考的应该都不是太清楚。以后可能要持续更新,好的东西都是打磨出来的。等自己再上一个台阶也会想想当时的思维,写下来也有个记录还是挺好的。

觉得容易理解的话面向对象的23种设计模式点这里

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释器模式是一种行为型设计模式,它用于将一种语言的语法表示为一个解释器,以便通过解释器来执行特定的操作。在Java中,解释器模式可以用于解析和执行特定的文法规则。 在解释器模式中,我们定义了一个接口或抽象类来表示语言的文法规则,并为每个文法规则定义了一个具体的解释器解释器接受一个表达式,并对其进行解释执行。 Java中的解释器模式通常使用递归下降解析器来实现。递归下降解析器通过递归地从顶层规则开始,逐步解析语法树上的各个节点,最终完成整个语法分析过程。 下面是一个简单的示例,演示了如何使用解释器模式来解析并执行一个简单的表达式语言: ```java // 抽象表达式类 interface Expression { int interpret(); } // 终结符表达式类 class NumberExpression implements Expression { private int number; public NumberExpression(int number) { this.number = number; } @Override public int interpret() { return number; } } // 非终结符表达式类 class AddExpression implements Expression { private Expression left; private Expression right; public AddExpression(Expression left, Expression right) { this.left = left; this.right = right; } @Override public int interpret() { return left.interpret() + right.interpret(); } } // 客户端代码 public class Client { public static void main(String[] args) { // 构建语法树 Expression expression = new AddExpression( new NumberExpression(10), new AddExpression( new NumberExpression(5), new NumberExpression(3) ) ); // 执行解释器 int result = expression.interpret(); System.out.println(result); // 输出: 18 } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值