Khác biệt giữa các bản “Memento pattern”

n
using AWB
n (Bot: Di chuyển 13 liên kết ngôn ngữ đến d:q1418619 tại Wikidata (Addbot))
n (using AWB)
Đôi khi việc ghi lại trạng thái trong của một đối tượng là rất cần thiết. Việc này được yêu cầu khi thực thi việc kiểm tra và cơ chế Undo (cơ chế cho phép người dùng rút lại những thao tác không chắc chắn hoặc khôi phục lại do có lỗi). Bạn phải lưu thông tin về trạng thái ở một nơi nào đó để bạn có thể khôi phục lại đối tượng về trạng thái trước của nó. Nhưng các đối tượng thường đóng gói một vài hoặc tất cả trạng thái của chúng để làm cho các đối tượng khác không thể truy cập hoặc để cho những trạng thái của nó không thể bị lưu trữ bên ngoài. Việc phơi bày những trạng thái này sẽ vi phạm tính đóng gói, điều này có thể làm tổn hại đến tính tin cậy và tính mở rộng của ứng dụng.
Chúng ta hãy xem xét ví dụ về trình soạn thảo đồ hoạ có hỗ trợ kết nối giữa các đối tượng. Một người dùng có thể kết nối hai hình chữ nhật bằng một đường thẳng và những hình chữ nhật này sẽ vẫn liên kết với nhau khi người dùng di chuyển một trong số chúng. Trình soạn thảo đảm bảo rằng đường thẳng trải ra để duy trì sự kết nối.
 
 
Một cách nổi tiếng để duy trì kết nối mối quan hệ giữa các đối tượng là dùng hệ thống giải quyết ràng buộc. Chúng ta có thể đóng gói chứng năng này trong đối tượng ConstraintSolver. ConstraintSolver ghi lại những kết nối khi chúng được tạo ra và tạo ra những phương trình toán học để miêu tả những kết nối này. Nó sẽ giải những phương trình này bất cứ khi nào người dùng tạo ra kết nối hoặc chỉnh sửa sơ đồ. ConstraintSolver sử dụng kết quả mà nó tính toán được để sắp xếp lại các hình để duy trì kết nối.
Việc hỗ trợ undo trong ứng dụng này không phải là dễ. Một cách rõ ràng để undo lại một thao tác dịch chuyển là lưu trữ khoảng cách đã dịch chuyển và dịch chuyển đối tượng quay trở về khoảng cách đó. Tuy nhiên điều này không đảm bảo rằng tất cả các đối tượng sẽ xuất hiện ở đúng vị trí của nó trước đó. Giả sử rằng có một vài chỗ trùng trong kết nối. Trong trường hợp này, đơn giản là di chuyển hình chữ nhật trở về vị trí ban đầu của nó không đạt được hiệu quả mong muốn.
 
Nhìn chung, giao diện dùng chung của ConstraintSolver có thể là không đủ để cho phép hiệu quả đảo ngược một cách chính xác của nó lên đối tượng khác. Cợ chế undo phải làm việc thân thiện hơn với ConstraintSolver để thiết lập lại trạng thái trước đó, nhưng chúng ta cũng nên tránh để lộ ra trạng thái trong của ConstraintSolver cho cơ chế undo.
Dựa vào những thông tin trong SolverState, ConstraintSolver sẽ thay đổi cấu trúc bên trong của nó để trở lại chính xác trạng thái trước của các biến và phương trình của nó.
Sự sắp xếp này cho phép ConstraintSolver giao phó cho những đối tượng khác những thông tin mà nó cần để chuyển về trạng thái trước mà không phải để lộ cấu trúc và sự trình diễn bên trong.
 
 
3. Tính ứng dụng:
2. Một giao diện trực tiếp để đạt được trạng thái sẽ để lộ chi tiết của sự thực thi và phá vỡ tính đóng gói của đối tượng.
4. Cấu trúc:
 
5. Mô tả các lớp:
8. Thực thi:
Đây là hai vấn đề phải xem xét khi thực thi mẫu Memento:
1. Ngôn ngữ hỗ trợ. Memento có hai giao diện: Một giao diên rộng cho Originator và một giao diện hẹp cho những đối tượng khác. Ngôn ngữ thực thi lý tưởng sẽ hỗ trợ hai mức bảo vệ tĩnh. C++ cho phép bạn làm việc này bằng cách làm cho Originator là lớp bạn của Memento và giao diện rộng của Memento là private. Chỉ có giao diện hẹp mới được khai báo là public.
 
Ví dụ:
2. Lưu trữ sự thay đổi thêm vào. Khi Memento được tạo ra và truyền trở về cho Originator của nó trong một chuỗi có thế đoán trước, thì Memento chỉ có thể lưu trữ sự thay đổi thêm vào của trạng thái trong Originator.
 
Ví dụ:
 
Những lệnh có thể làm lại trong danh sách các lệnh đã đựơc thực hiện có thể sử dụng Memento để đảm bảo rằng các lệnh đó sẽ được khôi phục về trạng thái chính xác của nó khi nó được undo. Danh sách các lệnh đã được thực hiện định nghĩa một trật tự xác định các lệnh có thể được undo hoặc redo. Điều này có nghĩa Mementor chỉ có thể lưu trữ sự thêm vào mà một lệnh gây ra chứ không phải tất cả trạng thái của mọi đối tượng mà chúng ảnh hưởng. Trong ví dụ motivation đã được đưa ra lúc trước, ConstraintSolver chỉ lưu trữ những cấu trúc bên trong- cái mà thay đổi để giữ đường thẳng kết nối những hình chữ nhật, chứ không phải lưu trữ vị trí của những đối tượng này.
2. Iterator: Mementos có thể được sử dụng cho quá trình lặp như đã mô tả lúc trước.
 
[[Thể loại:Mẫu thiết kế phần mềm]]
[[Thể loại:Tin học]]
5.681.853

lần sửa đổi