關鍵字: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.效率無關:追求效率的語法解釋通常使用狀態機解決。
文章來源于領測軟件測試網 http://www.anti-gravitydesign.com/