آموزش دیزاین پترن (Design Patterns) قسمت 8 : الگوی Memento

با سلام به همه دوستان و همراهان Itpro. در ادامه سری مقالات الگوهای طراحی قصد دارم که الگوی طراحی Memento رو شرح بدهم. این الگو را با نام Token نیز می شناسند. نام این الگو از روی یک فیلم برداشته شده است که عکس آن فیلم را ملاحظه می کنید. داستان این فیلم به این گونه بود که نقش اول این فیلم هیچ حافظه ای نداشت و مطالبی را که قصد به خاطر سپردن آن ها را داشت بر روی برگه های کوچکی یادداشت می کرد و از روی نوشته هایش تصمیم گیری می کرد. این الگو نیز به همین شکل است. همان گونه که در الگوی Command توضیح دادیم می توان از الگوی Command برای پیاده سازی عمل undo استفاده کرد اما مکانیزم آن را به طور کامل شرح ندادیم. الگوی Command زمینه را برای پیاده سازی این عمل فراهم می کند ولی اطلاعاتی که در هر تغییر باید بازگردانی شوند باید با استفاده از الگوی Memento ذخیره گردند. الگوی memento همان مکانیزم یادداشت ها را در فیلم گفته شده فراهم می کند.

اهداف این الگو

  1. بدون این که خللی در کپسوله سازی وارد کند حالت فعلی یک شی را دریافت و نگهداری می کند.
  2. حالت شی را بعد از این که ذخیره کرد هر وقت که نیاز داشته باشیم برمی گرداند. این ویژگی برای گرفتن Checkpoint و مکانیزم undo مفید است.

به طور کلی این الگو برای نگهداری وضعیت داخلی یک شی و ذخیره آن به صورت خارج کلاسی می باشد که بعدا بتوان این حالت شی را به وضعیت قبلی بازگرداند.

آموزش دیزاین پترن (Design Patterns) قسمت 8 : الگوی Memento

شرح الگو

همه ی نرم افزارهای مدرن امروزه از قابلیتی به نام Undo استفاده می نمایند. این قابلیت به این صورت است که اگر ما کاری را در یک نرم افزار انجام داده باشیم و بخواهیم که برنامه این عمل ما را نادیده فرض کنید از این قابلیت استفاده می نماییم. و برنامه را به حالت قبل از عمل برمی گرداند. به طور مثال اگر در یک برنامه واژه پرداز (word processor) متنی را نوشته باشیم یا متنی را به عمد و یا غیر عمد حذف کرده باشیم ولی از انجام آن پشیمان شویم از قابلیت undo استفاده می نماییم. همچنین در بازی های رایانه ای موجود وقتی به مرحله ی خاصی از بازی رسیدیم وضعیت بازی ذخیره می شود. که به هر قسمت ذخیره شده یک check point گفته می شود. ذخیره سازی وضعیت نرم افزار در برنامه گفته شده و check point بازی با استفاده از الگوی memento انجام می شود.

طراحی الگو (Design)

ذخیره وضعیت برنامه می تواند مستقل از خود شی باشد و این نکته کلیدی الگوی memento است. شکل نمودار uml این الگو در زیر آورده شده است:

آموزش دیزاین پترن (Design Patterns) قسمت 8 : الگوی Memento

کلاسی است که اشیا آن می توانند وضعیت خود را ذخیره کنند. این کلاس می تواند تصمیم بگیرد که هر بار چند تا از وضعیت ها ذخیره شوند. متغیر state شامل اطلاعات وضعیت شی originator است. این متغیری است که ما آن را ذخیره و بازیابی می کنیم. تابع CreateMemento برای ذخیره وضعیت originator استفاده می شود. این تابع یک شی Memento می سازد و شی state را با استفاده از آن ذخیره می نماید. تابع SetMemento شی وضعیت originator را با گرفتن شی Memento بر می گرداند. این تابع برای بازیابی وضعیت قبل می باشد که قبلا در شی memento ذخیره شده بود. کلاس Memento عمل ذخیره سازی وضعیت originator را به شکل تاریخچه ای انجام می دهد و Caretaker وضعیت های ذخیره شده را در خود نگهداری می کند. به این شکل که لیستی از memento ها را در خود دارد. الگوی memento دارای دو واسط به شکل زیر است:

  • یک واسط گسترده به سمت Originagtor که اجازه می دهد که به هر چیزی که می خواهد ذخیره کند دسترسی داشته باشد
  • یک واسط محدود شده به سمت Caretaker که فقط می تواند به ارجاعات memento دسترسی داشته باشد.

کلاس Memento وضعیت Originator را در خود نگهداری می کند ولی به کلاس های دیگر اجازه دسترسی به آن وضعیت را نمی دهد. با این کار محدودیت های کپسوله سازی (encapsulation) رعایت خواهد شد. دقت داشته باشید که شی کلاس memento هیچگاه توسط کاربر در دسترس نخواهد بود و همه ی اعمال توسط کلاس Caretaker انجام می شود. زیرا نحوه ذخیره و بازیابی به کلاس client مربوط نمی شود.

پیاده سازی

پیاده سازی این الگو در شکل زیر آمده است.

class Program
{
    static void Main(string[] args)
    {
        Originator<string> orig = new Originator<string>();
orig.SetState("state0");
        Caretaker<string>.SaveState(orig); //save state of the originator
        orig.ShowState();
orig.SetState("state1");
        Caretaker<string>.SaveState(orig); //save state of the originator
        orig.ShowState();
orig.SetState("state2");
        Caretaker<string>.SaveState(orig); //save state of the originator
        orig.ShowState();
//restore state of the originator
        Caretaker<string>.RestoreState(orig, 0);
        orig.ShowState();  //shows state0
    }
}
//object that stores the historical state
public class Memento<t>
{
    private T state;
public T GetState()
    {
        return state;
    }
public void SetState(T state)
    {
        this.state = state;
    }
}
//the object that we want to save and restore, such as a check point in an application
public class Originator<t>
{
    private T state;
//for saving the state
    public Memento<t> CreateMemento()
    {
        Memento<t> m = new Memento<t>();
        m.SetState(state);
        return m;
    }
//for restoring the state
    public void SetMemento(Memento<t> m)
    {
        state = m.GetState();
    }
//change the state of the Originator
    public void SetState(T state)
    {
        this.state = state;
    }
//show the state of the Originator
    public void ShowState()
    {
        Console.WriteLine(state.ToString());
    }
}
//object for the client to access
public static class Caretaker<t>
{
    //list of states saved
    private static List<memento><t>> mementoList = new List<memento><t>>();
//save state of the originator
    public static void SaveState(Originator<t> orig)
    {
        mementoList.Add(orig.CreateMemento());
    }
//restore state of the originator
    public static void RestoreState(Originator<t> orig, int stateNumber)
    {
        orig.SetMemento(mementoList[stateNumber]);
    }
}

نتیجه اجرای کد بالا به شکل زیر است:

عکس

امروزه از الگوی memento در بسیاری از نرم افزارها استفاده می شود و حتی برخی از کامپوننت های برنامه نویسی خود از این الگو استفاده می نمایند(مانند کنترل RichTextBox در سی شارپ که قابلیت undo دارد) ولی وقتی نیاز به این الگو حس می شود که در برخی پردازش های مهندسی که ممکن است چند روز طول بکشد، وسط اجرای پردازش مشکلی پیش بیاید و مجبور شویم پردازش را از سر بگیریم که باعث اتلاف وقت و هزینه بسیاری است. برای جلوگیری از این اتلاف هزینه و زمان از مکانیز گرفتن check point استفاده می شود که این مکانیزم هم برای پیاده سازی از الگوی memento استفاده می کند و در هر بار خرابی سیستم از آخرین check point کار را ادامه می دهد.Itpro باشید.

نویسنده : مهدی عادلی

منبع : جزیره برنامه نویسی وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

#آموزش_design_pattern #الگوهای_طراحی #آموزش_الگوهای_طراحی #الگوهای_طراحی_در_نرم_افزار #آموزش_برنامه_نویسی_شئ_گرا #گرفتن_check_point_در_سی_شارپ #پیاده_سازی_undo #الگوهای_طراحی_شی_گرا
عنوان
1 آموزش دیزاین پترن (Design Patterns) قسمت 1 : اطلاعات پایه رایگان
2 آموزش دیزاین پترن (Design Patterns) قسمت 2 : معرفی الگوها رایگان
3 آموزش دیزاین پترن (Design Patterns) قسمت 3 : Singleton و Adapter رایگان
4 آموزش دیزاین پترن (Design Patterns) قسمت 4 : الگوی Observer رایگان
5 آموزش دیزاین پترن (Design Patterns) قسمت 5 : الگوی Iterator رایگان
6 آموزش دیزاین پترن (Design Patterns) قسمت 6 : الگوی Command رایگان
7 آموزش دیزاین پترن (Design Patterns) قسمت 7 : الگوی Mediator رایگان
8 آموزش دیزاین پترن (Design Patterns) قسمت 8 : الگوی Memento رایگان
9 آموزش دیزاین پترن (Design Patterns) قسمت 9 : الگوی Strategy رایگان
10 آموزش دیزاین پترن (Design Patterns) قسمت 10 :الگوی Factory Method رایگان
11 آموزش دیزاین پترن (Design Patterns) قسمت 11 : الگوی State رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....