Triết lý đằng sau mô hình vật lưu niệm


9

Tôi đã đọc lên mô hình vật lưu niệm từ nhiều nguồn khác nhau của internet. Thông tin khác nhau từ các nguồn khác nhau đã khiến tôi bối rối về lý do tại sao mẫu này thực sự cần thiết.

Việc triển khai dofactory nói rằng mục đích chính của mẫu này là khôi phục trạng thái của hệ thống.

Wiki nói rằng mục đích chính là có thể khôi phục các thay đổi trên hệ thống. Điều này mang lại một tác động khác - nói rằng có thể một hệ thống có thể thực hiện memento mà không cần phải khôi phục. Và khả năng khôi phục đó là một tính năng của điều này.

OODesign nói rằng

Đôi khi cần phải nắm bắt trạng thái bên trong của một đối tượng tại một thời điểm nào đó và có khả năng khôi phục lại đối tượng về trạng thái đó sau đó. Một trường hợp như vậy là hữu ích trong trường hợp lỗi hoặc thất bại.

Vì vậy, câu hỏi của tôi là tại sao chính xác chúng ta sử dụng cái này? Là để lưu các trạng thái trước đây - hoặc để thúc đẩy đóng gói giữa Người chăm sóc và Memento? Tại sao loại đóng gói này rất quan trọng?

Chỉnh sửa: Đối với những người truy cập, hãy xem Thực hiện này !

Chỉnh sửa : Tôi đang làm việc trong việc thực hiện một giải pháp lưu niệm cho vấn đề của tôi. Tôi sẽ đăng một câu hỏi khác liên quan đến điều đó và liên kết câu hỏi đó với câu hỏi này. Cảm ơn tất cả đã trả lời với các đề xuất có giá trị!

Chỉnh sửa 3 : Đây là liên kết đến việc thực hiện mẫu của tôi

Câu trả lời:


2

Một mô hình tương tự, Ghi nhớ hoặc Ghi nhớ cũng lưu trữ trạng thái, nhưng nó thường được sử dụng làm tối ưu hóa tốc độ chương trình. Nếu một hoạt động tiêu tốn thời gian có số lượng đầu vào và đầu ra chung hạn chế, thì những hoạt động phổ biến nhất (hoặc tất cả chúng) có thể được lưu trữ trong một hashtable. Khi được gọi lại với cùng một đầu vào, đầu tiên nó sẽ kiểm tra hàm băm và nếu tìm thấy chúng, nó sẽ trả về đầu ra trước đó mà không tính toán lại.

Tôi tưởng tượng một mẫu Memento cũng có thể được sử dụng cho hiệu suất - thay vì thực hiện tất cả các phép tính ngược cho thay đổi trạng thái ngược, chỉ cần khôi phục từ trạng thái trước đó. Một số chức năng là một chiều, vì vậy không có hoàn tác trừ khi bạn lưu trữ trạng thái trước đó.

Bạn có thể sử dụng mẫu Memento để ghi nhớ một hàm tuần hoàn hoặc hàm đối xứng như sin. Tính toán tất cả các giá trị từ 0-180 độ, sau đó đi ngược lại chúng để lấy các giá trị âm từ 180-360. Tốt hơn hết, hãy tính các giá trị từ 0-90, sau đó chuyển ngược qua các giá trị đó để nhận 90-180, chuyển tiếp trong 180-270 và ngược lại từ 270-360.

Ctrl-Z trong Word hoặc chức năng hoàn tác của bất kỳ phần mềm nào có thể được triển khai bằng cách sử dụng mẫu memento hoặc trong một số trường hợp, có thể bằng cách đảo ngược chức năng tạo ra mỗi thay đổi. Trong trường hợp thứ hai, lịch sử của các hàm được gọi sẽ là mementos, vì vậy tôi cho rằng mẫu memento luôn được sử dụng để hoàn tác.


mô hình ghi nhớ được sử dụng để tránh tính toán ngược và cho các chức năng định kỳ - cảm ơn thông tin này! Không có gì giống như một ví dụ thực tế để có được các khái niệm để thấm vào!
TheSilverBONS

Nó cũng có thể được sử dụng với một cái gì đó giống như phương pháp của Newton để tính gần đúng căn bậc hai để quyết định khi nào bạn hoàn thành. mitpress.mit.edu/sicp/full-text/book/ trộm Vì biểu diễn dấu phẩy động cơ bản có độ chính xác hạn chế, tất cả các số cuối cùng sẽ có các xấp xỉ lặp lại. Nếu bạn biết các xấp xỉ cũ là gì, bạn có thể dừng xấp xỉ lần đầu tiên lặp lại câu trả lời và nhận được độ chính xác tối đa (với chi phí của một số thời gian và bộ nhớ).
GlenPeterson

8

Chính nó, Mẫu Memento chỉ được sử dụng để chụp và lưu các trạng thái. Việc đóng gói chỉ tồn tại để bảo vệ các trạng thái khỏi phần còn lại của hệ thống - một khi một trạng thái bị bắt giữ, nó cần phải được kiểm soát cẩn thận. Ví dụ, không có nghĩa là có thể thay đổi trạng thái trước khi nó được lưu (điều đó sẽ thay đổi lịch sử) và sẽ không có nghĩa là chỉ đơn giản trở lại trạng thái trước đó của một đối tượng mà không ảnh hưởng đến người khác (để ngăn chặn hệ thống từ trạng thái hoàn toàn không hợp lệ).

Việc sử dụng phổ biến nhất của một Memento mà tôi đã thấy là để hỗ trợ chức năng hoàn tác. Nó cũng liên quan đến việc lưu trữ chức năng làm lại bằng cách di chuyển ngược thời gian.


Tôi cũng đã sử dụng nó trong logic sao chép và logic tuần tự hóa (để gửi các đối tượng qua một dây hoặc lưu trạng thái vào một tệp).
Scott Whitlock

@ScottWhitlock Lưu trạng thái vào một tệp có ý nghĩa đối với Memento. Đối tượng Memento sẽ có khả năng tự viết thành định dạng đã chỉ định và tạo một định dạng mới bằng cách đọc định dạng này, trong khi Người chăm sóc sẽ cung cấp giao diện để lưu trạng thái sang định dạng bên ngoài hoặc trạng thái tải từ định dạng bên ngoài - đó chỉ là một phần mở rộng để lưu trạng thái trong bộ nhớ. Tôi thực sự không thể thấy nó được sử dụng trong logic sao chép. Tôi phải suy nghĩ về nó nhiều hơn nữa.
Thomas Owens


@ThomasOwens, cảm ơn vì phần quan trọng trong lời giải thích của bạn rằng vật lưu niệm về cơ bản là để "lưu" trạng thái. Đó là quyết định của người thực hiện để khôi phục hay không! Tôi tìm thấy phần này của lời giải thích bị thiếu trong tất cả các tài liệu tham khảo của tôi !!
TheSilverBONS

@ScottWhitlock, cảm ơn rất nhiều vì liên kết đến việc thực hiện memento của bạn! Tôi đã có thể hiểu không chỉ sử dụng cơ bản của nó, mà còn sử dụng trực quan như bạn đã làm!
TheSilverBONS

1

Tất cả những định nghĩa này chỉ đạo bạn theo cùng một hướng; tất cả họ đều nói rằng vấn đề là có thể khôi phục một cái gì đó về trạng thái trước đó. Rằng một cái gì đó có thể là toàn bộ hệ thống, hoặc chỉ là một đối tượng.

Mẫu này hữu ích nếu một bản ghi thay đổi trạng thái theo thời gian, nhưng bạn có yêu cầu nghiệp vụ để có thể khôi phục nó về bất kỳ trạng thái nào trước đó bất cứ lúc nào. Hoặc cách khác, nếu bạn cần có thể xem bản ghi như tại bất kỳ thời điểm nào trước đó. Những loại yêu cầu này rất phổ biến trong nhiều loại hệ thống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.