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