کارگروه
C#‎
این کارگروه صرفا برای برنامه نویسی با زبان C#‎ ایجاد گردید،امید هست در کنار هم بتوانیم دانشمان را ارتقا دهیم
 

Design Pattern Interpreter

صفحه اصلی کارگروهها >> C#‎  >> Design Pattern Interpreter
حمید کریمی

حمید کریمی

در کارگروه: C#‎
تعداد ارسالي: 9
13 سال پیش در تاریخ: چهارشنبه, مرداد 05, 1390 4:20

لطفا در این پست مشارکت بفرمایید


این  pattern برای خواندن و تحلیل یک string است بدین معنا که شما string را وارد می کنید مثلا "12345" و می خواهید به صورت حروفی بخوانید "دوازده هزارو سیصدوچهل و پنج"


البته این مثال بسیار ساده است و در اصل از این pattern برای تحلیل هر نوع string و تحلیل آن بکار می رود.


نقشه  pattern Interoreter



این pattern از دو کلاس اصلی استفاده می کند


1-Context


2-abstract class Expression


1-Class Context


این کلاس حاوی دو پراپرتی است که اولی برای گرفتن string و دومی خروجی بعد از تحلیل می باشد


























class Context


  {


    private string _input;


    private int _output;


 


    // Constructor


    public Context(string input)


    {


      this._input = input;


    }


 


    // Gets or sets input


    public string Input


    {


      get { return _input; }


      set { _input = value; }


    }


 


    // Gets or sets output


    public int Output


    {


      get { return _output; }


      set { _output = value; }


    }


  }


 




















2-abstract class Expression


در این abstract class با توجه به قوانین تحلیلی که می خواهیم بر روی رشته دریافتی اعمال کنیم ، قوانینی را وارد می کنیم و با ارث بردن از این کلاس می توانیم قوانین خود را اعمال کنیم.


با توجه به مثالی که در سایت dofactory.com گفته شده pattern را توضیح می دهم


در این مثال یک رشته وارد می کنیم و با تحلیل آن را تبدیل به اعداد  می کنیم


string وارد شده










string roman = "MCMXXVIII"


ابتدا کلاس context را مانند بالا ایجاد می کنیم


سپس abstract class Expression را ایجاد می کنیم.عددی که می خواهیم بخوانبم در این مثال می تواند چهار عدد 9و4و1و5 باشد پس ابسترکت کلاس ما به شکل زیر است






































abstract class Expression


  {


    public void Interpret(Context context)


    {


      if (context.Input.Length == 0)


        return;


 


      if (context.Input.StartsWith(Nine()))


      {


        context.Output += (9 * Multiplier());


        context.Input = context.Input.Substring(2);


      }


      else if (context.Input.StartsWith(Four()))


      {


        context.Output += (4 * Multiplier());


        context.Input = context.Input.Substring(2);


      }


      else if (context.Input.StartsWith(Five()))


      {


        context.Output += (5 * Multiplier());


        context.Input = context.Input.Substring(1);


      }


 


      while (context.Input.StartsWith(One()))


      {


        context.Output += (1 * Multiplier());


        context.Input = context.Input.Substring(1);


      }


    }


 


    public abstract string One();


    public abstract string Four();


    public abstract string Five();


    public abstract string Nine();


    public abstract int Multiplier();


  }


 


چون عدد ما چهار رقمی است پس چهار کلاس برای هزارگان ،صدگان،دهگان و یکان از ابسترکت کلاسمان ارث بری می کنیم

























  /// <summary>


  /// A 'TerminalExpression' class


  /// <remarks>


  /// Thousand checks for the Roman Numeral M


  /// </remarks>


  /// </summary>


  class ThousandExpression : Expression


  {


    public override string One() { return "M"; }


    public override string Four() { return " "; }


    public override string Five() { return " "; }


    public override string Nine() { return " "; }


    public override int Multiplier() { return 1000; }


  }



  /// <summary>


  /// A 'TerminalExpression' class


  /// <remarks>


  /// Hundred checks C, CD, D or CM


  /// </remarks>


  /// </summary>


  class HundredExpression : Expression


  {


    public override string One() { return "C"; }


    public override string Four() { return "CD"; }


    public override string Five() { return "D"; }


    public override string Nine() { return "CM"; }


    public override int Multiplier() { return 100; }


  }



  /// <summary>


  /// A 'TerminalExpression' class


  /// <remarks>


  /// Ten checks for X, XL, L and XC


  /// </remarks>


  /// </summary>


  class TenExpression : Expression


  {


    public override string One() { return "X"; }


    public override string Four() { return "XL"; }


    public override string Five() { return "L"; }


    public override string Nine() { return "XC"; }


    public override int Multiplier() { return 10; }


  }



  /// <summary>


  /// A 'TerminalExpression' class


  /// <remarks>


  /// One checks for I, II, III, IV, V, VI, VI, VII, VIII, IX


  /// </remarks>


  /// </summary>


  class OneExpression : Expression


  {


    public override string One() { return "I"; }


    public override string Four() { return "IV"; }


    public override string Five() { return "V"; }


    public override string Nine() { return "IX"; }


حال تمامی کلاسهایمان ساخته شد و می توانیم از آنها به صورت زیر استفاده کنیم














  class MainApp


  {


    /// <summary>


    /// Entry point into console application.


    /// </summary>


    static void Main()


    {


      string roman = "MCMXXVIII";


      Context context = new Context(roman);


 


      // Build the 'parse tree'


      List<Expression> tree = new List<Expression>();


      tree.Add(new ThousandExpression());


      tree.Add(new HundredExpression());


      tree.Add(new TenExpression());


      tree.Add(new OneExpression());



      // Interpret


      foreach (Expression exp in tree)


      {


        exp.Interpret(context);


      }


 


      Console.WriteLine("{0} = {1}",


        roman, context.Output);


 


      // Wait for user


      Console.ReadKey();


    }


  }


موفق باشید


 


 














حذف ارسالي ويرايش ارسالي