این سایت برای ie9 طراحی نشده است

لطفا دستگاه خود را بچرخانید.

الگوی طراحی – Interpreter

۱۷ اردیبهشت ۱۳۹۶ حسین صداقت
بدون دیدگاه

به نام خدا

همانطور که در مطلب قبل اشاره کرده بودیم در این مطلب می خواهیم الگوی طراحی Interpreter یا مفسر  را با هم بررسی کنیم.همانطور که اسم این Design Pattern  پیداست این الگو روش و راه حل مناسبی جهت پیاده سازی یک مفسر یا مترجم در اختیار ما قرار می دهد.با استفاده از این الگو یک زبان ساده را میتوانیم پیاده سازی کنیم.

دیاگرام این الگو به صورت زیر است:

 

interpreter

مثال:

فرض کنید ما میخواهیم یک زبان با گرامر خاص خودش جهت رسم اشکال هندسی ایجاد کنیم . میخواهیم این زبان به این صورت باشد که:

۱-برای رسم دایره از عبارت  Circle استفاده کنیم.

۲-برای رسم مثلث از عبارت Triangle استفاده کنیم .

۳-برای رسم مستطیل از عبارت Rectangle استفاده کنیم.

 

برای پیاده سازی این برنامه ابتدا کلاس Context  را پیاده سازی می کنیم.کلاس Context کلاسی است که رشته ورودی را از ما گرفته و در اختیار کلاس هایی که قرار است این رشته را تفسیر کنند می گذارد.

public string _input;
public Context(string input)
{
    _input = input;
}
public string Input { get { return _input; } }

 

در مرحله بعد ما کلاس AbstrartExpression  را پیاده سازی می کنیم.AbstractExpression در حقیقت یک Interface که کلاس های مفسر ما باید از این کلاس ارث ما باید از این کلاس ارث ببرند.اگر کلاس های مفسر ما عملیات یکسانی رو داشته باشند به جهت جلوگیری از پیاده سازی چند باره آن عملیات در این کلاس پیاده سازی می شود.

abstract class AbstractExpression
{
    public void Interpret(Context context)
    {
        if (context.Input.Length == 0)
            return;

        if (context.Input.StartsWith(Sentence()))
        {
            Draw();
        }
    }
    public abstract string Sentence();
    public abstract void Draw();

}

 

و در نهایت به سراغ پیاده سازی کلاس های مفسر می رویم که به صورت زیر می باشد:

class CircleExpression : AbstractExpression
{
    public override string Sentence()
    {
        return "Circle";
    }
    public override void Draw()
    {
        //Draw Circle
    }
}


class TriangleExpression : AbstractExpression
{
    public override string Sentence()
    {
        return "Triangle";
    }
    public override void Draw()
    {
        //Draw Triangle
    }
}
class RectangleExpression : AbstractExpression
{
    public override string Sentence()
    {
        return "Rectangle";
    }
    public override void Draw()
    {
        //Draw Rectangle
    }
}

 

در انتها باید به این نکته هم اشاره کنیم این Design Pattern جز الگو های طراحی کم کاربرد است و اگر هم سرچی در اینترنت بکنید مثال زیادی از این الگو پیدا نخواهید کرد.در نیتجه این الگو انقدر ارزش ندارد که وقت زیادی رو جهت یادگیری اش صرف کنیم و فقط کلیتی از این Pattern در ذهن ما شکل بگیرد کافیست.

در مطلب بعدی الگوی طراحی Iterator را با هم بررسی خواهیم کرد.