Memento Design Pattern trong C# – Cách triển khai và ví dụ

Trong bài viết này mình sẽ giới thiệu đến các bạn Memento Design Pattern trong C# – Cách triển khai và ví dụ. Đây là một loại pattern thuộc nhóm Behavioral Design Pattern trong C#.

Chúng ta sẽ cùng nhau tìm hiều về Memento Design Pattern là gì? Cách triển khai trong C# và một vài ví dụ cụ thể về nó.

Memento Design Pattern trong C# là gì?

Memento Design Pattern được sử dụng để khôi phục một đối tượng về trạng thái trước đó của nó.

memento 02 png

Điều đó có nghĩa là nếu bạn muốn thực hiện một số loại hoạt động hoàn tác, khôi phục trong ứng dụng thì có thể sử dụng Memento Design Pattern.

Bài viết này được đăng tại [kiso.vn]

Một Memento Design Pattern có các phần sau đây:

  • Originator: Là đối tượng chịu trách nhiệm khôi phục trạng thái trước đó.
  • Memento: Nó giữ trạng thái bên trong của một Originator.
  • Caretaker: Có trách nhiệm giữ các mementos.

Để hiểu rõ hơn, mình có một ví dụ cụ thể dưới đây.

memento 01 png

Như các bạn thấy ở hình trên đây, mình có một nhân viên tên là Quyền, có ID 101 và mức lương là 2000$. Bây giờ mình sẽ thay đổi lương thành 3000$.

Sau một thời gian cảm thấy không hợp lệ, mình muốn cho nó quay lại trạng thái ban đầu. Khi đó sẽ sử dụng Memento Design Pattern để làm chuyện này.

Cách triển khai và ví dụ về Memento Design Pattern trong C#

Trong phần này mình sẽ thực hiện triển khai Memento Design Pattern trong C# thông qua một ví dụ cụ thể. Các bạn cùng mình thực hiện theo trình tự các bước nhé.

Bước 1: Tạo class LEDTV.

Trong class này có ba thuộc tính: Size, Price, USBSupport. Sau đó khởi tạo constructor LEDTV với ba thuộc tính trên. Trong class này có thêm phương thức GetDetails() để trả về chi tiết các thông tin của TV LED.

using System;
using System.Collections.Generic;
using System.Text;

namespace MementoDesignPattern
{
    public class LEDTV
    {
        public string Size { get; set; }
        public string Price { get; set; }
        public bool USBSupport { get; set; }
        public LEDTV(string Size, string Price, bool USBSupport)
        {
            this.Size = Size;
            this.Price = Price;
            this.USBSupport = USBSupport;
        }
        public string GetDetails()
        {
            return "LEDTV [Size=" + Size + ", Price=" + Price + ", USBSupport=" + USBSupport + "]";
        }
    }
}

Bước 2: Tạo class Memento.

Class này được sử dụng để lưu giữ trạng thái bên trong của trình khởi tạo.

using System;
using System.Collections.Generic;
using System.Text;

namespace MementoDesignPattern
{
    public class Memento
    {
        public LEDTV ledTV { get; set; }
        public Memento(LEDTV ledTV)
        {
            this.ledTV = ledTV;
        }
        public string GetDetails()
        {
            return "Memento [ledTV=" + ledTV.GetDetails() + "]";
        }
    }
}

Bước 3: Tạo class CareTaker.

Được sử dụng để duy trì các mementos object.

using System;
using System.Collections.Generic;
using System.Text;

namespace MementoDesignPattern
{
    public class Caretaker
    {
        private List<Memento> ledTvList = new List<Memento>();
        public void AddMemento(Memento m)
        {
            ledTvList.Add(m);
            Console.WriteLine("LED TV's snapshots Maintained by CareTaker :" + m.GetDetails());
        }
        public Memento GetMemento(int index)
        {
            return ledTvList[index];
        }
    }
}

Bước 4: Tạo class Originator.

Trong class có phương thức CreateMemento() được sử dụng để thiết lập trạng thái bên trong đối tượng Memento. Phương thức SetMementor()được sử dụng để khôi phục trạng thái.

using System;
using System.Collections.Generic;
using System.Text;

namespace MementoDesignPattern
{
    public class Originator
    {
        public LEDTV ledTV;

        public Memento CreateMemento()
        {
            return new Memento(ledTV);
        }
        public void SetMemento(Memento memento)
        {
            ledTV = memento.ledTV;
        }
        public string GetDetails()
        {
            return "Originator [ledTV=" + ledTV.GetDetails() + "]";
        }
    }
}

Bước 5: Tạo client.

Trong class này chúng ta sẽ truyền các thông tin chi tiết, sau đó hiển thị và kiểm tra kết quả.

using System;

namespace MementoDesignPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Originator originator = new Originator();
            originator.ledTV = new LEDTV("42 inch", "60000Rs", false);

            Caretaker caretaker = new Caretaker();
            caretaker.AddMemento(originator.CreateMemento());
            originator.ledTV = new LEDTV("46 inch", "80000Rs", true);
            caretaker.AddMemento(originator.CreateMemento());
            originator.ledTV = new LEDTV("50 inch", "100000Rs", true);

            Console.WriteLine("nOrignator current state : " + originator.GetDetails());
            Console.WriteLine("nOriginator restoring to 42 inch LED TV");
            originator.ledTV = caretaker.GetMemento(0).ledTV;
            Console.WriteLine("nOrignator current state : " + originator.GetDetails());

            Console.WriteLine("n----------------------------------------");
            Console.WriteLine("Chuong trinh nay duoc dang tai Freetut.net");
            Console.ReadKey(); 
        }
    }
}

Kết quả:

memento 03 png

Như vậy là chúng ta đã cùng nhau tìm hiểu về Memento Design Pattern trong C# – Cách triển khai và ví dụ cụ thể về nó. Đây cũng là loại pattern cuối cùng trong nhóm Behavioral Design Pattern mà mình muốn giới thiệu, cảm ơn các bạn đã theo dõi !!!

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *