設計模式(十五):直譯器模式

K戰神發表於2016-01-18

一、定義

在設定環境中,定義一種規則或者語法,通過直譯器來解釋規則或者語法的含義.

二、例項:將  二十一    —>    21

2.1 設定我們的環境 Context

 public class Context
    {
        public string Input { get; set; }
        public int Output { get; set; }
    }

2.2 根據語法來解釋

抽象直譯器:

 public abstract class Interpreter
    {
        public string FlagStr { get; set; }
        public int Num { get; set; }
        public abstract int Interpret(Context context);
    }

具體解釋:

二=2

  public class Two : Interpreter
    {
        public Two()
        {
            FlagStr = "";
            Num = 2;
        }

        public override int Interpret(Context context)
        {
            return Num;
        }
    }

一=1

 public class One : Interpreter
    {
        public One()
        {
            FlagStr = "";
            Num = 1;
        }

        public override int Interpret(Context context)
        {
            return Num;
        }
    }

十=*10

 public class Tenfold : Interpreter
    {
        public Tenfold()
        {
            FlagStr = "";
            Num = 10;
        }
        public override int Interpret(Context context)
        {
            return context.Output*Num;
        }
    }

再封裝一下:

 public class InterpretPrivoder
    {
        public int FormatStr(Context context)
        {
            foreach (char c in context.Input)
            {
                switch (c)
                {
                    case '': context.Output += new One().Interpret(context); break;
                    case '': context.Output += new Two().Interpret(context); break;
                    case '': context.Output = new Tenfold().Interpret(context); break;
                }
            }
            return context.Output;
        }
    }

其中,未結束符為二和一,結束符為十

客戶端:

 //------------------------直譯器模式-----------------------
            Interpreter.Context interpretContext = new Interpreter.Context();
            interpretContext.Input = "二十一";
            Interpreter.InterpretPrivoder interpreter = new Interpreter.InterpretPrivoder();
            interpreter.FormatStr(interpretContext);
            Console.WriteLine(interpretContext.Output);
            Console.ReadKey();

結果:

三、總結

直譯器模式,實在一種模式經常出現,並不斷變化。我們可以使用直譯器。

缺點就是容易子類膨脹

 

相關文章