关键字:C# 面向对象 设计模式
分析一下代码。
这段代码是将中文的数字转换为阿拉伯数字,如果按照面向过程的算法肯定是来截取字符串进行判断然后组合成正确的数字。在这段代码中则利用了interpreter模式将位数进行表达式的封装。
首先看抽象Expression类,首先他封装了一个字典类,这个字典保存了中文的1-9的字符及其对应的阿拉伯数字。Interpret方法,在便利字典中的每个中文数字,并且判断截取中文数字加其后缀是否是结尾,如果为真那么将对应的值乘以对应的位数,对应的位数是一个纯虚函数Multiplier,由派生类自己实现。在取得了对应的Expression的值后需要将中文数字语句中对应的字符串去掉,即GetLength函数,取得对应的位数符合加1。这是一个虚函数,可以由派生类重写。注意GeExpression就重写了此虚函数,因为个位数的长度是1,而不是位数符加1。
注意下面这段代码
if(context.Statement.EndsWith("零"))
{
context.Statement = context.Statement.Substring(0, context.Statement.Length - 1);
}
这是处理三万零五十类似中间有零来分割的情况,将零去掉。
在WanExpression中,我们重写了Interpret函数,这是由于万位数可以由千位一下的数字来描述,如三千二百万。重写Interpret函数的算法如下,先将千以下的表达式(包括千)加入一个ArrayList保存起来,然后遍历数字表,如果当前的表达式已经截取到万,那么先将已取得的数值用中间临时变量保存起来,将当前表达式的数字值置为0。然后将万以后的文字截取。在依次用ArrayList里面的千、百、十、个的Expression进行解释,最后取得的数值乘以万对应的位数加上临时变量。这里的算法不用担心亿的情况,因为没有亿的运算符表达式,算到亿的时候,解释器已经算完描述万的数值
在看Main函数的调用,在Main函数里使用ArrayList保存了个十百千万的表达式,依次用这些表达式来解析上下文。注意,解析的顺序是个十百千万的顺序。
解释器模式是用来解释语言的文法的。但是它的适用范围其实很有限:
1.简单文法:对于复杂的文法来说,解释器模式会让类的层次复杂的难以管理,如果个十百千万类似位数符很多,那么派生类的体系将相当庞大。所以此模式适用于文法比较简单的
2.效率无关:追求效率的语法解释通常使用状态机解决。
文章来源于领测软件测试网 https://www.ltesting.net/