[C#]解釋器模式 (Interpreter Pattern)
目的
日常開發的時候,有時候會有一串字串,然後可以希望在調用端直接呼叫物件,並快速轉換成最後希望得到的格式。
情境模擬
如果今天我們有一串字串,第一個字母為A加數字的時候,希望轉換回來的是繁中的國語數字,如果是B的話則希望轉換回來的是英文數字,相關如何實做數字轉換成文字的細節google就有了,這邊主要想記錄的是設計模式的使用時機,所以就是直接無惱的寫死了。
調用端的樣子
void Main()
{
Expression expression = null;
ContextDto context = new ContextDto();
context.Text = "A1000 A1100 A1111"; //希望得到國字
expression = new TranslateChinese();
var result = expression.Interpret(context);
result.Dump();
context.Text = "B1000 B1100 B1111"; //希望得到英文數字
expression = new TranslateEnglish();
result = expression.Interpret(context);
result.Dump();
}
實做解釋器模式的細節
ContextDto
class ContextDto
{
private string text;
public string Text
{
get { return text; }
set { text = value; }
}
}
Expression
abstract class Expression
{
/// <summary>
/// 主要在parse為各國數字的過程
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public List<string> Interpret(ContextDto context)
{
List<string> currencys = new List<string>();
if (context.Text.Length > 0)
{
foreach (var text in context.Text.Split(' '))
{
int number = Convert.ToInt16(text.Substring(1, text.Length - 1));
currencys.Add(Excute(number));
}
}
return currencys;
}
public abstract string Excute(int num);
}
TranslateChinese
class TranslateChinese : Expression
{
public override string Excute(int num)
{
switch (num)
{
case 1000:
return "一仟";
case 1100:
return "一仟一百";
case 1111:
return "一仟一百一十一";
default:
return "零";
}
}
}
TranslateEnglish
class TranslateEnglish : Expression
{
public override string Excute(int num)
{
switch (num)
{
case 1000:
return "One thousand";
case 1100:
return "One thousand one hundred";
case 1111:
return "One thousand one hundred eleven";
default:
return "Zero";
}
}
}
最後結果