Mẫu thiết kế: Mẫu Memento

Tram Ho

I. Giới thiệu:


Memento là một Design Pattern thuộc loại Behavior. Nó cho phép chúng ta lưu trữ và khôi phục trạng thái của một đối tượng mà không tiết lộ chi tiết bên trong của nó.
Memento Pattern gồm các thành phần chính như sau:

  • Originator: là Object có trạng thái được lưu trữ hoặc khôi phục.
  • Mementor: là trạng thái (State) của Object khi đang được lưu trữ.
  • CareTaker: đóng vai trò lưu trữ và cấp phát các Memento. Nó có trách nghiệm lưu trữ các State ở dạng Memento và cấp phát các State cho các Object khi cần.

II. Cách thức hoạt động:


Memento Pattern sẽ cấu trúc các dữ liệu cần lưu của một Object thành một State, sau đó sẽ lưu lại State này. Các State sau khi được lưu lại sẽ được gọi là các Memento. CareTaker sẽ đóng vai trò lưu trữ các State thành Memento và xuất các Memento thành State để có thể sử dụng. Do trạng thái của các Object đều được lưu trữ trong State nên khi State này được truyền qua các Object khác nhau thì sẽ không để lộ các implement chi tiết của các Object đó.

III. Memento Pattern được sử dụng khi nào?


Memento Pattern được sử dụng bất cứ khi nào chúng ta muốn lưu và sau đó khôi phục trạng thái của một Object. Ví dụ như khi chúng ta chơi game, chúng ta muốn lưu lại tất cả những trạng thái chúng ta đã chơi trước đó để sau khi quit game và mở lại thì chúng ta có thể tiếp tục chơi, khi đó ta có thể áp dụng Memento Pattern để giải quyết bài toán này.

IV. Ví dụ:


Trong ví dụ, chúng ta sẽ sử dụng class Game với vai trò của Originator. Bên trong class Game sẽ chứa một State để lưu lại các trạng thái của nó. Trạng thái của Game sẽ được lưu vào trong UserDefault, vì vậy chúng ta cần adopt Codable protocol.

Object Game sẽ được lưu vào UserDefault ở dạng Data. Do vậy, Data trong Swift ở ví dụ này sẽ đóng vai trò là Memento.

Để quản lý việc lưu trữ các Memento, chúng ta sẽ cần tới CareTaker. GameSystem đóng vai trò là CareTaker. Class này sẽ có trách nghiệm lưu trữ hoặc lấy các Memento khi cần thiết.

Sử dụng:

V. Tài liệu tham khảo:


Chia sẻ bài viết ngay

Nguồn bài viết : Viblo