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

我们要做一个表达式解释引擎,能解释带有变量的任意表达式。例如:
表达式为: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创办人


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张传波

打赏的朋友很帅噢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值