دیزاین پترن Memento

دیزاین پترن Memento

Behavioral DESIGN PATTERNS

یکی از زیرشاخه های الگوهای طراحی، Behavioral Design Patterns است. تمرکز و وظیفه اصلی این دیزاین پترن ها تعامل اشیاء و جداسازی وظایف آن ها  از یکدیگر است.

Memento Design Pattern

دیزاین پترن Memento یکی از زیرشاخه های الگوهای طراحی از نوع Behavioral است.

الگوی طراحی Memento بدون نقض انکپسولیشن، حالت داخلی یک شی را ضبط و برون سازی می کند تا بتواند بعداً به این حالت بازگردد.

سختش نکنیم! تابحال به عملکرد Undo دقت کردید؟ هر وقت بخوایم میتونیم یک مرحله کارمون رو به عقب برگردونیم. این دقیقا همین دیزاین پترنه! هروقت میخوای وضعیت هایی رو نگهداری کنی که هروقت خواستی بتونی به عقب برگردی (نه صرفا یکی یکی عقب بری، هر وضعیتی که خواستی میتونی بری) از این دیزاین پترن استفاده میکنیم.

میزان استفاده : کم

پیاده سازی دیزاین پترن Memento

کلاس Memory را که یک State یا وضعیت دارد به این شکل پیاده سازی کردیم.

class Memory
    {
        private string state;
        public Memory(string state)
        {
            this.state = state ?? "";
        }
        public string GetState()
        {
            return state ?? "";
        }
    }

کد MemoryManager که جهت مدیریت حافظه ( همین Memory) است را به این شکل نوشته ایم.

class MemoryManager
    {
        private string state;
        public void SetState(string state)
        {
            this.state = state ?? "";
            Console.WriteLine("State = " + state);
        }
        public string GetState()
        {
            return state ?? "";
        }
        public Memory Save()
        {
            return new Memory(state);
        }
        public void Recover(Memory memory)
        {
            state = memory.GetState();
        }
    }

در این کد یک وضعیت نگهداری میکنیم که با استفاده از Setter و Getter مخصوص مقداردهی میشود و مقدارش نمایش داده میشود و بازگردانده میشود.
یک متد جهت ذخیره سازی داریم و یک متد جهت Recovery یعنی بازگشت به یک وضعیت خاص را داریم.
کد MemoryProgrammer که وظیفه نگهداری وضعیت ها در حافظه را دارد به این شکل پیاده سازی کرده ایم.

class MemoryProgrammer
    {
        private List memoriesList = new List();

        public void Write(Memory memory)
        {
            memoriesList.Add(memory);
        }
        public Memory Recover(int index)
        {
            if (index < 0 || index >= memoriesList.Count) return null;
            return memoriesList[index];
        }
    }

در این کدها یک متد جهت درج یک وضعیت جدید در لیست نگهداری داریم و یک متد که بر اساس ایندکس میتوانیم یک وضعیت را بازگردانی کنیم داریم.
حال به سراغ متد main برویم.

static void Main(string[] args)
        {
            try
            {
                MemoryProgrammer programmer = new MemoryProgrammer();
                MemoryManager manager = new MemoryManager();
                manager.SetState("variable 1");
                manager.SetState("variable 2");
                programmer.Write(manager.Save());
                manager.SetState("variable 3");
                programmer.Write(manager.Save());
                manager.SetState("variable 4");
                ShowMessage(manager.GetState());
                int index = 0;
                Memory mem = null;
                while ((mem = programmer.Recover(index)) != null)
                {
                    ShowSuccess($"Index[{(index + 1)}] = {mem.GetState()}");
                    index++;
                }
            }
            catch (Exception ex)
            {
                ShowError(ex.Message);
            }
            Console.ReadLine();
        }

خروجی این کد :

State = variable 1
State = variable 2
State = variable 3
State = variable 4
variable 4
Index[1] = variable 2
Index[2] = variable 3

برای آموزش رایگان در مورد انواع دیزاین پترن ها و معماری های نرم افزار می توانید به این آموزش مراجعه نمایید:

معماری نرم افزار مهم ترین پترن های معماری نرم افزار

دیزاین پترن یا الگوی طراحی چیست؟

دیزاین پترن  در حقیقت راه حل مسائل طراحی نرم افزار هستند که بارها و بارها در دنیای توسعه نرم افزار تکرار میشوند. الگوهایی از طراحی قابل استفاده مجدد (reusable) و تعامل اشیاء.

پرینت صفحه

هولوسن

با من یاد بگیر

آموزش های بیشتر در وبسایت هولوسن : https://holosen.net

بدون نظر

**پرسش و پاسخ** سوال خود مطرح کنید.
امتیاز شما*