通俗易懂的Java设计模式之 --解释器模式

Java中的解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言文法,以及解释该语言的解释器,用于解释一些特定的表达式或语句。

解释器模式中包含两个核心角色:抽象表达式(AbstractExpression)和具体表达式(ConcreteExpression)。抽象表达式定义了一个解释器接口,而具体表达式则负责实现具体的解释逻辑。

下面是一个简单的例子,假设我们需要实现一个简单的加减乘除计算器,它支持以下操作:

  • 数字:可以输入任意数字,例如 123

  • 加法:使用符号 +,例如 1+2

  • 减法:使用符号 -,例如 3-1

  • 乘法:使用符号 ,例如 23

  • 除法:使用符号 /,例如 6/2

现在我们可以使用解释器模式来实现该计算器,首先定义一个抽象表达式:

public interface Expression {
    int interpret();
}

然后实现具体的表达式:

//数字解释器
public class NumberExpression implements Expression {
    private final int number;

    public NumberExpression(int number) {
        this.number = number;
    }

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

//加法解释器
public class AddExpression implements Expression {
    private final Expression leftExpression;
    private final Expression rightExpression;

    public AddExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }

    @Override
    public int interpret() {
        return leftExpression.interpret() + rightExpression.interpret();
    }
}

//减法解释器
public class SubtractExpression implements Expression {
    private final Expression leftExpression;
    private final Expression rightExpression;

    public SubtractExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }

    @Override
    public int interpret() {
        return leftExpression.interpret() - rightExpression.interpret();
    }
}

//乘法解释器
public class MultiplyExpression implements Expression {
    private final Expression leftExpression;
    private final Expression rightExpression;

    public MultiplyExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }

    @Override
    public int interpret() {
        return leftExpression.interpret() * rightExpression.interpret();
    }
}

//除法解释器
public class DivideExpression implements Expression {
    private final Expression leftExpression;
    private final Expression rightExpression;

    public DivideExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }

    @Override
    public int interpret() {
        return leftExpression.interpret() / rightExpression.interpret();
    }
}

最后定义一个计算器解释器:

public class Calculator {
    private final Map<String, Expression> variables = new HashMap<>();

    public int calculate(String expression) {
        Stack<Expression> stack = new Stack<>();

        for (String token : expression.split("\\s")) {
            if (isOperator(token)) {
                Expression rightExpression = stack.pop();
                Expression leftExpression = stack.pop();

                switch (token) {
                    case "+":
                stack.push(new AddExpression(leftExpression, rightExpression));break;
                    case "-":
                stack.push(new SubtractExpression(leftExpression, rightExpression));break;
                    case "*":
                stack.push(new MultiplyExpression(leftExpression, rightExpression));break;
                   case "/":
                stack.push(new DivideExpression(leftExpression, rightExpression));break; }
} else {
               Expression expressionObj = new NumberExpression(Integer.parseInt(token));
               stack.push(expressionObj);
                  }
               }
           return stack.pop().interpret();
          }
         private boolean isOperator(String token) {
                 return "+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token);
          }
}

现在,我们就能使用这个计算器进行加减乘除运算了。

Calculator calculator = new Calculator();
int result = calculator.calculate("3 4 5 * -");
System.out.println(result); // -17

在上面的例子中,我们首先定义了一个抽象表达式接口 Expression,然后实现了具体的表达式类 NumberExpression、AddExpression、SubtractExpression、MultiplyExpression 和 DivideExpression,这些类实现了 Expression 接口中定义的 interpret() 方法,用于解释对应的表达式。

我们还定义了一个 Calculator 类,用于将输入的表达式解析成一个表达式树,然后通过遍历表达式树,使用表达式类计算表达式的值。通过这种方式,我们就实现了一个简单的加减乘除计算器。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值