前言 :
您的使用者可以對應用程式屬性進行設定,假設應用程式相關屬性是放在Application物件中,您想要設計一個屬性備份還原功能,如果您直接在Application物件中建立備份復原機制,這會使得物件本身的職責加重,與其在物件內建立備份復原機制,不如將備份復原機制從物件中脫離出來,如此一來還有可能在別的地方重用備份復原機制.
Memento 模式 :
您可使用一個 Backup物件 來封裝想要備份的資訊,Application 會負責建立Backup物件,建立的 Backup物件 則交由一個 Recovery物件 來管理,一個可能的設計方式如下所示 :
在改變 Application 狀態設定之前,您可以使用 backup() 方法對狀態進行備份,Recovery 則管理儲存 Backup 物件,之後若想要還原 Application 狀態,則可以從 Recovery 取得備份資訊進行還原。例如 :
- package john.dp.memento;
- import java.util.Date;
- public class Main {
- public static void main(String[] args) {
- Application application = new Application();
- Recovery recovery = new Recovery();
- System.out.println(application.getState());
- Backup backup = application.backup(); // 建立備忘
- recovery.add(backup); // 加入備忘錄
- application.setState("customer setting");
- System.out.println(application.getState());
- Date date = backup.date; // 假設 date 是使用者自行設定所要取得的還原時間!
- application.recover(recovery.retrieve(date)); // 取得備忘來還原
- System.out.println(application.getState());
- }
- }
圖中的 Caretaker 是用來保留原發者所創造的備忘錄物件,以供日後復原時取回,state 表示一個內部狀態,內部狀態多時,也可以將之組織為一個類別,Caretaker 維護的 Memento 可以是多個,可用來實現 Redo 與 Undo 多次的功能. 範例中 Application 即 Originator 的角色, Backup 即 Memento 的角色,Recovery 即 Caretaker 的角色.
沒有留言:
張貼留言