Tìm hiểu mô hình Memento trong javascript

Tìm hiểu mô hình Memento trong javascript

Mô hình Memento cung cấp khả năng lưu trữ tạm thời cũng như khôi phục một đối tượng. Cơ chế mà bạn lưu trữ trạng thái của đối tượng phụ thuộc vào khoảng thời gian bền vững cần thiết, có thể khác nhau.

Cách sử dụng mô hình Memento trong javascript

Mô hình Memento được sử dụng trong đó các đối tượng được duy trì và khôi phục. Tuy nhiên, lý do phổ biến nhất để sử dụng mô hình này là lưu lại trạng thái của một đối tượng để có thể hoàn tác bất kỳ thay đổi nào sau đó một cách dễ dàng nếu cần.

Về cơ bản, mô hình Memento là một kho lưu trữ nhỏ lưu trữ trạng thái của một đối tượng. Các tình huống mà bạn có thể muốn khôi phục một đối tượng về trạng thái đã tồn tại trước đó bao gồm: Lưu và khôi phục trạng thái của trình phát trong trò chơi trên máy tính hoặc thực hiện thao tác hoàn tác trong cơ sở dữ liệu.

Mô hình Memento dễ dàng được thực hiện bằng cách tuần tự hóa và hủy tuần tự hóa các đối tượng với JSON.

Các đối tượng tham gia vào mô hình này

  • Người khởi tạo - Trong mã ví dụ: Person
  • Triển khai giao diện để tạo và khôi phục các vật lưu niệm của chính nó
       - trong ví dụ là: hydrate và dehydrate
  • Đối tượng mà trạng thái tạm thời đang được lưu và khôi phục
  • Memento - Trong mã ví dụ: JSON đại diện cho Person
  • Trạng thái bên trong của đối tượng Originator ở một số định dạng lưu trữ
  • CareTaker - Trong mã ví dụ: CareTaker
  • Chịu trách nhiệm lưu trữ vật lưu niệm
  • Chỉ là một kho lưu trữ; không thực hiện thay đổi đối với vật lưu niệm

Ví dụ

Mã ví dụ tạo ra hai người có tên AB được tạo bằng cách sử dụng Person là hàm khởi tạo. Tiếp theo, vật lưu niệm của họ được tạo ra và được duy trì bởi đối tượng CareTaker.

Chúng tôi chỉ định tên không có thật của AB trước khi khôi phục chúng từ vật lưu niệm của họ. Sau khi khôi phục, chúng tôi xác nhận rằng các đối tượng người đã trở lại trạng thái ban đầu với tên hợp lệ.

Bản thân mẫu Memento với CareTaker, v.v. hiếm khi được sử dụng trong JavaScript. Tuy nhiên, JSON là một định dạng dữ liệu hiệu quả cao, cực kỳ hữu ích trong nhiều trường hợp trao đổi dữ liệu khác nhau.

var Person = function (name, street, city, state) {
this.name = name;
this.street = street;
this.city = city;
this.state = state;
}

Person.prototype = {

hydrate: function () {
    var memento = JSON.stringify(this);
    return memento;
},

dehydrate: function (memento) {
    var m = JSON.parse(memento);
    this.name = m.name;
    this.street = m.street;
    this.city = m.city;
    this.state = m.state;
}

}

var CareTaker = function () {
this.mementos = {};

this.add = function (key, memento) {
    this.mementos[key] = memento;
},

    this.get = function (key) {
        return this.mementos[key];
    }

}

function run() {

var A = new Person("nguyen van A", "Duc Dien", "Bac Tu Liem", "hn");
var B = new Person("Le van B", "NHan Chinh", "Thanh xuan", "hn");
var caretaker = new CareTaker();


caretaker.add(1, A.hydrate());
caretaker.add(2, B.hydrate());


A.name = "King Kong";
B.name = "Superman";


A.dehydrate(caretaker.get(1));
B.dehydrate(caretaker.get(2));

console.log(A.name);
console.log(B.name);

}