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

Ngày đăng: 2023-05-06 21:05:01

Mục lục

1.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ó.

Đ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.

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.

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.

2.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.

LEDTV.cs

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.

Memento.cs

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.

Caretaker.cs

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.

Originator.cs

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ả.

Program.cs

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 thuanhoaonline.com");

            Console.ReadKey();

        }

    }

}

Kết quả:

 

Về bài trước


Tài liệu lập trình C#

Bài viết trong cùng chuyên mục

Góc games giải trí (chơi trực tiếp trên web) Đăng nhập (chơi có thưởng)Hướng dẫn chơi nhận thưởng



Cờ caro


Butterfly


Lật hình (luyện trí nhớ)

Cờ tướng ONLINE

Xếp hình

Ghép hình

15_PUZZLE

Kill ghosts

Banchim

Planet Defense

Tower game

Bắn bóng

Plapy Bird (NH.Đông)

Diablo

Vẽ hình cứu người

Game Phases

Game vui chơi có thưởng

Game bắn cá

Street Fight (Chơi trên điện thoại và máy tính bảng)

Street Fight (Chơi trên máy tính và laptop)



0379136392

Thông tin liên hệ: Lê Văn Thuyên - ĐT: 0379136392 ; Gmail: lethuyen0379136392@gmail.com

 +   Lê Văn Thuyên-0379136392:Cảm ơn quý vị và các bạn đã vào Website của Lê Thuyên! Lê thuyên rất mong nhận được sự góp ý của quý vị và các bạn. Xin chân thành cảm ơn!

 *   Dũng Trung-090567448:Lê Văn Thuyên0379136392--->Ok.Anh!

 *   Bé Nguyễn-benguyen@gmail,com:Lê Văn Thuyên0379136392--->Good job!

 +   KTT-0362497726:Ok! Mình rất thích trang web của bạn.

 +   HoangQuan-0985073641:Cần tạo nhiều game hay nữa em!

 *   Lê Thuyên-0379136391:HoangQuan0985073641--->Ok! Em cảm ơn anh ạ!

 +   Lê Dương-0393499146:Làm thêm game 3D nữa?

 *   Lê Thuyên-0379136392:Lê Dương0393499146--->Sắp có game 3D hay rồi.Tuyệt phẩm nhé kkk

 *   Lê Dương-0393499146:Lê Dương0393499146--->Game Street Fight mới chỉ chơi được trên máy tính phải không anh Titoe?

 *   Lê Thuyên-0379136392:Lê Dương0393499146--->Ừ Em. Anh đang làm điều khiển cho phần Smathhome em.

 *   Lê Thuyên-0379136392:Lê Dương0393499146--->Game Street Fight đã chơi được trên điện thoại rồi nhé em.

 +   L.Ngư-0906744578:Nghiên cứu tích hợp sàn giao dịch tiền ảo đi cu.

 *   Lê Thuyên-0379136392:L.Ngư0906744578--->Đang nghiên cứu Grandma.

 +   Nguyễn Tuyển-0909615882:Thiết kế web đa ngôn ngữ đi em.

 *   Lê Thuyên-0379136392:Nguyễn Tuyển0909615882--->Ok chị!

378025