درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
تخفیف های وب سایت
همه تخفیف ها

عضویت در

کانال تلگرام

توسینسو

اطلاعات مطلب
مدرس/نویسنده
مهدی عادلی فر
امتیاز: 160708
رتبه:6
163
199
299
1604
مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم. پروفایل کاربر

الگوهای طراحی شی گرا (object oriented design patterns) الگوی Memento

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

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


  1. بدون این که خللی در کپسوله سازی وارد کند حالت فعلی یک شی را دریافت و نگهداری می کند.
  2. حالت شی را بعد از این که ذخیره کرد هر وقت که نیاز داشته باشیم برمی گرداند. این ویژگی برای گرفتن Checkpoint و مکانیزم undo مفید است.
به طور کلی این الگو برای نگهداری وضعیت داخلی یک شی و ذخیره آن به صورت خارج کلاسی می باشد که بعدا بتوان این حالت شی را به وضعیت قبلی بازگرداند.
الگوهای طراحی شی گرا (object oriented design patterns) الگوی Memento


شرح الگو

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

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


ذخیره وضعیت برنامه می تواند مستقل از خود شی باشد و این نکته کلیدی الگوی memento است. شکل نمودار uml این الگو در زیر آورده شده است:
الگوهای طراحی شی گرا (object oriented design patterns) الگوی 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 باشید.


نویسنده : مهدی عادلی
منبع : جزیره برنامه نویسی وب سایت توسینسو
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.
برچسب ها
ردیف عنوان
1 الگوهای طراحی شی گرا (Object Oriented Design Patterns) قسمت اول (اطلاعات پایه)
2 الگوهای طراحی شی گرا (Object Oriented Design Patterns) قسمت دوم (معرفی الگوها)
3 الگوهای طراحی شی گرا (Object Oriented Design Patterns) الگو های (Singleton و Adapter)
4 الگوهای طراحی شی گرا (Object Oriented Design Patterns) الگوی Observer
5 الگوهای طراحی شی گرا (Object Oriented Design Patterns) الگوی Iterator
6 الگوهای طراحی شی گرا (object oriented design patterns) الگوی Command
7 الگوهای طراحی شی گرا (object oriented design patterns) الگوی Mediator
8 الگوهای طراحی شی گرا (object oriented design patterns) الگوی Memento
9 الگوهای طراحی شی گرا (Object Oriented Design Patterns) الگوی Strategy
10 الگوهای طراحی شی گرا (Object Oriented Design Patterns) الگوی Factory Method
11 الگوهای طراحی شی گرا (Object Oriented Design Patterns) الگوی State
دوره مجموعه کل دوره
مطالب مرتبط

در حال دریافت اطلاعات

نظرات
هیچ نظری ارسال نشده است

    برای ارسال نظر ابتدا به سایت وارد شوید