在我們平時的開發工作中,很多場景需要我們備份和恢復,比如資料庫binlog日誌備份、mvcc多版本併發控制、瀏覽器的回退、chrome奔潰後重新開啟恢復之前的頁面。在gof《設計模式》定義如下:
captures and externalizes an object』s internal state so that it can be restored later, all without violating encapsulation.
就是不改變原有封裝的情況下,捕獲和暴露物件的內部狀態,以便之後可以用來恢復。
現在假設有乙個場景,dba每天備份一次binlog,有新的binlog日誌請求到來時,增加到binlog上,並且日終的時候,儲存當天的binlog,如果某一天資料庫需要恢復到之前某一天的狀態,拿出備份的binlog進行恢復就行。**如下:
定義乙個binlog類,如下:logbuilder記錄日誌具體內容,createsnapshot用來建立乙個快照,restoresnapshot用來恢復快照
public class binlog
}public snapshot createsnapshot()
public void restoresnapshot(snapshot snapshot)
}
下面是快照類
public class snapshot
public binlog getbinlog()
}
snapshotholder類用來儲存和獲取快照
public class snapshotholder
public void storesnapshot(string date, snapshot snapshot)
}
下面的應用類是增加新日誌和用快照恢復資料,如下:
public static void main(string args) }
注意:上面的記錄快照的方式用了全量記錄的方式,mysqlsh資料庫實際也是使用了這種方式。但是這種方式儲存成本很高。適用於增量資料比較多的場景。如果增量資料少,可以用於備份增量的方式,這時恢復到之前的某乙個快照時,就用之前的增量快照進行累加。
這時修改snapshotholder的getsnapshot方法,如下:
備忘錄模式 行為型
3 相關模式 1 備忘錄模式和命令模式 這兩個模式可以組合使用。命令模式實現中,在實現命令的撤銷和重做的時候,可以使用備忘錄模式,在命令操作的時候記錄下操作前後的狀態,然後在命令撇銷和重做的時候,直接使用相應的備忘錄物件來恢復狀態就可以了在這種撤銷的執行順序和重做的執行順序可控的情況下,備忘錄物件還...
備忘錄模式 行為型
3 相關模式 1 備忘錄模式和命令模式 這兩個模式可以組合使用。命令模式實現中,在實現命令的撤銷和重做的時候,可以使用備忘錄模式,在命令操作的時候記錄下操作前後的狀態,然後在命令撇銷和重做的時候,直接使用相應的備忘錄物件來恢復狀態就可以了在這種撤銷的執行順序和重做的執行順序可控的情況下,備忘錄物件還...
行為型設計模式 備忘錄模式詳解
備忘錄模式 memento pattern 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣就可以將該物件恢復到原先儲存的狀態 originator 發起者 記錄當前的狀態,負責建立和恢復備忘錄 memento 備忘錄 負責儲存發起者的狀態,在需要的時候提供發起人需要...