設計模式之備忘錄模式

2021-08-02 23:03:56 字數 1391 閱讀 4519

在日常生活中,總會出現這樣的情況,有時候做錯了一件事,然後特別希望能夠回到發生這件事情之前。當然,這在日常生活中是不可能,不過,在軟體開發過程卻是可以實現的,比如說我們經常使用的ctrl + z,或者一些其他軟體的回退功能等等,這其中就涉及到了備忘錄模式(memonto)。所謂的備忘錄模式,其實就是把當前物件的乙個狀態進行儲存,然後在必要的時候可以將其恢復,使得物件能夠回滾到之前的狀態

備忘錄模式中,有三個比較重要的概念,乙個是目標物件,也就是我們要進行儲存的物件,另外乙個是備份物件,用於儲存目標物件,還有乙個是備份物件的管理物件(有時候需要多次備份,此時使用該物件來進行管理是比較合適的)

接下來我們來實現簡單的備忘錄模式

/**

* created by huanfeng.xu on 2017-06-23.

* 英雄物件

*/public

class

hero

public

void

restore(memento memento)

}/**

* created by huanfeng.xu on 2017-06-23.

* 備忘錄物件,本質上等同於hero物件

*/public

class

memento

/** * created by huanfeng.xu on 2017-06-23.

* caretaker,用於管理備忘錄物件

*/public

class

caretaker

public

void

setmemento(memento memento)

}

這裡需要注意的一點是,雖然這裡使用了memento物件,不過這裡我們也看到,本質上它跟hero物件是一致的,所以,實際上也是可以不需要這個物件,只不過在儲存hero物件的時候需要注意,需要儲存的是hero物件的深拷貝,而不是直接令其指向hero物件。

在這裡一開始會覺得caretaker物件是多餘的,實際上不然,這裡我們只保留了乙個備份,也就是當下一次進行備份的時候,前面的備份就會被覆蓋了,此時,可以在caretaker物件中提供乙個容器類,比如list等,這樣子就可以儲存多份的備份了,恢復時只需要根據需要恢復特定的備份物件即可,所以說caretaker物件並不是多餘的。

這裡需要注意的是,當備份的物件比較多的時候,可能佔不少記憶體,此時,為了節省記憶體或者其他原因,可以將比較久遠的備份持久化到資料庫或者本地磁碟中,這樣子既有利於物件的長久保留,又有助於節省不必要的記憶體開銷

備忘錄模式也是一種比較常用的設計模式,主要用於物件的儲存、恢復的相關的操作,比如訂單的撤銷,回滾等操作,不過需要注意的是,當備份的數量比較多的時候,可能會佔據不少記憶體,此時可以選擇將其持久化到磁碟中。

設計模式之備忘錄模式

機器 public class machine public void startplay disc.setluminance 60 disc.settime 0 disc.setvolume 80 public void stopplay disc.setluminance 70 disc.set...

設計模式之備忘錄模式

定義 在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。備忘錄模式有三個角色 以儲存遊戲進度為例,退出遊戲前存檔,再進入遊戲就會顯示退出之前的狀態。示例 遊戲發起人類 public class game public state cr...

設計模式之 備忘錄模式

定義 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣就可以將該物件 恢復到原先儲存的狀態。很好理解,就像我們以前打通關遊戲一樣,打通某個關卡,就會備份一下,不然根本通不了關。備忘錄 負責儲存發起人物件的內部狀態,在需要的時候提供發起人需要的內部狀態。public c...