前言
在Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(13)命令模式》文章中,我们介绍了命令模式。本文是这个系列的第十四篇章,我们将讲解一下解释器模式的实现方式、应用场景以及它的用途。
解释器模式
解释器模式 是一种行为型设计模式,它定义了一种语言语法,以及解释器,可以解释这种语法。解释器模式通常用于编译器、解析器、表达式计算器等领域。
使用场景
1. 编译器、解释器:如正则表达式解析器、SQL 解析器、数学表达式计算器。
2. 规则引擎:如防火墙规则、权限系统中的访问控制规则。
3. 脚本语言:如计算器应用的表达式解析。
代码实现
下面是一个简单的数学表达式解释器,支持加、减、乘、除法运算。
/**
* 表达式接口
* @author Jensen
* @date 2024-04-22
* */
public interface Expression {
double interpreter();
}
/**
* 被计算的数字
* @author Jensen
* @date 2024-04-22
* */
public class NumberExpression implements Expression {
private final double number;
public NumberExpression(double number) {
this.number = number;
}
@Override
public double interpreter() {
return number;
}
}
/**
* 加法
* @author Jensen
* @date 2024-04-22
* */
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 double interpreter() {
return leftExpression.interpreter() + rightExpression.interpreter();
}
}
/**
* 减法
* @author Jensen
* @date 2024-04-22
* */
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 double interpreter() {
return leftExpression.interpreter() - rightExpression.interpreter();
}
}
/**
* 乘法
* @author Jensen
* @date 2024-04-22
* */
public class MultExpression implements Expression {
private final Expression leftExpression;
private final Expression rightExpression;
public MultExpression(Expression leftExpression, Expression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
@Override
public double interpreter() {
return leftExpression.interpreter() * rightExpression.interpreter();
}
}
/**
* 除法
* @author Jensen
* @date 2024-04-22
* */
public class DivisionExpression implements Expression {
private final Expression leftExpression;
private final Expression rightExpression;
public DivisionExpression(Expression leftExpression, Expression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
@Override
public double interpreter() {
if (rightExpression.interpreter() == 0){
System.out.println("除数不能为0");
return 0;
}
return leftExpression.interpreter() / rightExpression.interpreter();
}
}
这个示例展示了如何用解释器模式解析数学表达式,能够计算 (x + x) - (x + x) 这样的表达式,并且可以轻松扩展更多运算方式。
测试使用
System.out.println("------------------------------解释器模式-----------------------------");
AddExpression expr1 = new AddExpression(new NumberExpression(10), new NumberExpression(25));
AddExpression expr2 = new AddExpression(new NumberExpression(10), new NumberExpression(22));
System.out.println("expr1加法结果:"+expr1.interpreter());
System.out.println("expr2加法结果:"+expr2.interpreter());
System.out.println("expr1与expr2减法结果:"+new SubtractExpression(expr1, expr2).interpreter());
System.out.println("expr1与expr2乘法结果:"+new MultExpression(expr1, expr2).interpreter());
System.out.println("expr1与expr2除法结果:"+new DivisionExpression(expr1, expr2).interpreter());
输出结果
结语
解释器模式适用于特定领域的语法解析,可以将规则拆分为多个类,使得代码结构清晰,易于扩展。然而,它的缺点是可能会导致大量类的增加,从而影响性能,当规则变得复杂时,维护成本也会提高。因此,使用解释器模式需要注意。