[C#]解釋器模式 (Interpreter Pattern)

[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";
            }
        }
    }

最後結果