原创

4.6 《硬啃设计模式》 第23章 超级表达式解释引擎 - 解释器模式(Interpreter Pattern)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://fireball.blog.csdn.net/article/details/16344079
我们要做一个表达式解释引擎,能解释带有变量的任意表达式。例如:
表达式为:123+a * (b-456)/c-789
其中a、b、c为变量,只需要给定a、b、c的值,就可以计算出结果。
该表达式引擎支持四则运算、括号和任意数量的变量,并且我们希望能逐步扩展该引擎,使之可以用上各种函数,如:三角函数、Sqrt等。
你怎样考虑这个设计?

设计分析:
四则运算的运算规则:先括号,然后是乘除、加减,同级情况下从左到右。
例:表达式“123+a * (b-456)/c-789”的运算顺序
     首先计算:(b-456)
     然后:a*(b-456)
     接着:a*(b-456)/c
     再接着:123+a*(b-456)/c
     最后是:123+a*(b-456)/c-789
任何复杂的表达式,都可以分解为最简单的表达式组合。

表达式“123+a * (b-456)/c-789”,由以下三类表达式组合而成:

解释器1.png 

综合上述分析,我们需要对表达式建模,表达式被分解成最简单的部分后必是上述三种情况之一,这三种情况都是可以求解的。
解释器模式的核心思想就是对表达式进行建模,由此构建表达式树。

应用了解释器模式的设计如下:

解释器2.png 

说明:
1.Constant(常数)、Variable(变量)、Add(运算符)分别代表了表达式的三种情况,它们都实现IExpressiong接口。
2.如果需要增加运算符,则实现IExpression接口便可。
3.运算符需要有运算的对象,Add类包含IExpression就是这个意思。
4.常数、变量、运算符都被抽象成IExpression,而运算符又可以包含IExpression,这样就可以组成任意复杂的表达式树了。

程序要通过这样的框架,对表达式建模,建立一个Expresson Tree。
例:表达式“1+2”的建模
代码: new Add(new Constant("1"),new Constant("2"))

利用这套架构,系统可对任意表达式“建模”,并且具备扩展性。
建好模后,只需要在最顶层传入Context,模型采用“递归”算法,调用最底层的Interpret,然后逐层回退,最后到最顶层,则可以求出表达式的值。
说明:Context保存全局信息,并且是递归过程中的存储载体。

解释器模式只是提供了如何对表达式树建模及求值的解决框架,但要最终实现这个解释引擎,还要解决以下问题:
1.如何构建这个Expression Tree?
2.如何设计Context?

解释器模式类图

解释器3.png 

当需要考虑简单的语法解释时,可考虑用解释器模式。


请看下一文……

 

 

作者:张传波

创新工场创业课堂(敏捷课程)讲师

软件研发管理资深顾问

CMMI首席专家

《火球——UML大战需求分析》作者

www.umlonline.org创办人


文章最后发布于: 2013-11-15 18:55:18
展开阅读全文
0 个人打赏

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览