[Design Patterns] Memeto Pattern

Memento là pattern được thiết kế dựa trên phương thức hoạt động của cỗ máy thời gian cất trong ngăn kéo bàn học của Nobita hậu đậu. Memento thể hiện ước vọng muốn làm chủ định mệnh và chữa lành những ký ức đã qua bằng phần mềm Photoshop. Trong Memento, một object MainStream đại

Memento là pattern được thiết kế dựa trên phương thức hoạt động của cỗ máy thời gian
cất trong ngăn kéo bàn học của Nobita hậu đậu. Memento thể hiện ước vọng muốn làm chủ
định mệnh và chữa lành những ký ức đã qua bằng phần mềm Photoshop.

Trong Memento, một object MainStream đại diện cho dòng chảy chính của chương trình
có trạng thái được cập nhật thay đổi liên tục sẽ được theo dõi và đôi khi được lưu lại các snapshot
trạng thái quan trọng có thể cần được phục hồi. Object này thường được gọi với một cái tên
khác là Originator (bản nguyên).

Mỗi một snapshot hay trạng thái được lưu lại sẽ được gọi là 1 Memento, được hiểu nôm na
là một mảnh ký ức của dòng chảy chính. Các mảnh ký ức này được lưu lại trong một kho ký ức
Memory nhưng thường đường nhân cách hóa thành người giữ ký ức CareTaker và có thể
sẵn sàng được truy xuất bất kỳ thời điểm nào cần sử dụng.

Áp dụng triển khai

sơ đồ các class

Chẳng hạn bạn sử dụng Photoshop để manip (cách nói khác của tổ hợp, phối cảnh) một
khung cảnh yên bình với rất nhiều bước. Đâu đó đến bước thứ 1001 thì bạn cảm thấy dường
như đã thêm quá nhiều chi tiết khiến bối cảnh bị mất đi phong thái muốn tạo ra ban đầu.
Lúc này bạn muốn khôi phục lại tiến trình manip tới bước thứ 101 khi mới chỉ có hình nền
landscape và một vài bạn pet đang nô đùa. Đó là lúc 1 Memento cần được lấy ra từ kho ký
ức Memory và khôi phục thay vào trạng thái hiện tại của khung hình.

Bước 1

Tạo class Originator đại diện cho dòng chảy chính của chương trình.

mementopattern/Originator.java

packagemementopattern;publicclassOriginator{privateString state;publicOriginator(){
      state ="";}publicvoidsetState(String state){this.state = state;}publicStringgetState(){return state;}}

Bước 2

Tạo class Memento để đóng khung và lưu lại các snapshot trạng thái khi cần thiết.

mementopattern/Memento.java

packagemementopattern;publicclassMemento{privateString state;publicMemento(String state){this.state = state;}publicStringgetState(){return state;}}

Bước 3

Thêm tính năng lưu snapshot và khôi phục restore từ một snapshot cho chương trình Originator.

mementopattern.java

packagemementopattern;publicclassOriginator{privateString state;publicOriginator(){
      state ="";}publicvoidsetState(String state){this.state = state;}publicStringgetState(){return state;}publicMementosaveState(){returnnewMemento(state);}publicvoidrestore(Memento m){
      state = m.getState();}}

Bước 4

Tạo kho ký ức Memory để lưu trữ tập trung các snapshot và truy xuất khi cần dùng.

mementopattern/Memory.java

packagemementopattern;importjava.util.ArrayList;importjava.util.List;publicclassMemory{privateList<Memento> mementoList;publicMemory(){
      mementoList =newArrayList<Memento>();}publicvoidadd(Memento m){
      mementoList.add(m);}publicMementoget(int index){return mementoList.get(index);}}

Bước 5

Viết code main để dùng thử tính năng của Memento.

PatternDemo.java

importmementopattern.Memento;importmementopattern.Originator;importmementopattern.Memory;publicclassPatternDemo{publicstaticvoidmain(String[] args){Originator mainStream =newOriginator();Memory memory =newMemory();

      mainStream.setState("Trạng thái #1");
      mainStream.setState("Trạng thái #2");
      memory.add(mainStream.saveState());

      mainStream.setState("Trạng thái #3");
      memory.add(mainStream.saveState());

      mainStream.setState("Trạng thái #4");System.out.println("Trạng thái hiện tại: "+ mainStream.getState());Memento firstSaved = memory.get(0);System.out.println("Trạng thái đầu tiên đã lưu: "+ firstSaved.getState());Memento secondSaved = memory.get(1);System.out.println("Trạng thái thứ hai đã lưu: "+ secondSaved.getState());System.out.println("Khôi phục trạng thái đã lưu đầu tiên...");
      mainStream.restore(firstSaved);System.out.println("Trạng thái hiện tại: "+ mainStream.getState());}}

Bước 6

Kiểm chứng lại kết quả được in ra tại console.

console

Trạng thái hiện tại:Trạng thái #4Trạng thái đầu tiên đã lưu:Trạng thái #2Trạng thái thứ hai đã lưu:Trạng thái #3Khôi phục trạng thái đã lưu đầu tiên...Trạng thái hiện tại:Trạng thái #2

Nguồn: viblo.asia

Bài viết liên quan

9 Mẹo lập trình Web “ẩn mình” giúp tiết kiệm hàng giờ đồng hồ

Hầu hết các lập trình viên (kể cả những người giỏi) đều tốn thời gian x

Can GPT-4o Generate Images? All You Need to Know about GPT-4o-image

OpenAI‘s GPT-4o, introduced on March 25, 2025, has revolutionized the way we create visual con

Khi nào nên dùng main, section, article, header, footer, và aside trong HTML5

HTML5 đã giới thiệu các thẻ ngữ nghĩa giúp cấu trúc nội dung web một cách có

So sánh Webhook và API: Khi nào nên sử dụng?

Trong lĩnh vực công nghệ thông tin và phát triển phần mềm, Webhook và API là hai th