本文节选自《设计模式就该这样学》
1 使用解释器模式解析数学表达式
下面用解释器模式来实现一个数学表达式计算器,包含加、减、乘、除运算。
首先定义抽象表达式角色IArithmeticInterpreter接口。
1 | java复制代码 |
创建终结表达式角色Interpreter抽象类。
1 | java复制代码 |
然后分别创建非终结符表达式角色加、减、乘、除解释器,加法运算表达式AddInterpreter类的代码如下。
1 | java复制代码 |
减法运算表达式SubInterpreter类的代码如下。
1 | java复制代码 |
乘法运算表达式MultiInterpreter类的代码如下。
1 | java复制代码 |
除法运算表达式DivInterpreter类的代码如下。
1 | java复制代码 |
数字表达式NumInterpreter类的代码如下。
1 | java复制代码 |
接着创建计算器GPCalculator类。
1 | java复制代码 |
工具类OperatorUtil的代码如下。
1 | java复制代码 |
最后编写客户端测试代码。
1 | java复制代码 |
运行结果如下图所示。
当然,上面的简易计算器还没有考虑优先级,就是从左至右依次运算的。在实际运算中,乘法和除法属于一级运算,加法和减法属于二级运算。一级运算需要优先计算。另外,我们可以通过使用括号手动调整运算的优先级。我们再优化一下代码,首先新建一个枚举类。
1 | java复制代码 |
然后修改OperatorUtil的处理逻辑,设置两个栈。
1 | java复制代码 |
修改GPCalculator的代码。
1 | java复制代码 |
此时,再来看客户端测试代码。
1 | java复制代码 |
运行得到预期的结果,如下图所示。
2 解释器模式在JDK源码中的应用
先来看JDK源码中的Pattern对正则表达式的编译和解析。
1 | java复制代码 |
3 解释器模式在Spring源码中的应用
再来看Spring中的ExpressionParser接口。
1 | java复制代码 |
这里我们不深入讲解源码,通过我们前面编写的案例大致能够清楚其原理。不妨编写一段客户端代码验证一下。客户端测试代码如下。
1 | java复制代码 |
运行结果如下图所示。
由上图可知,运行结果与预期的结果是一致的。
关注『 Tom弹架构 』回复“设计模式”可获取完整源码。
本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。关注『 Tom弹架构 』可获取更多技术干货!
本文转载自: 掘金