Memento:備忘錄模式
先代碼
package h.l.demo.Memento;
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 備忘錄模式Demo
*/
public class Memento {
public static void main(String[] args) {
Originator originator = new Originator();
originator.setStateA("內部狀態A");
originator.setStateB("內部狀態B");
System.out.println("當前對象內部狀態:" + originator);
// 對當前狀態進行備份
MementoClass mementoClass = originator.createMementoClass();
// 改變當前狀態
originator.setStateA("內部狀態AA");
originator.setStateB("內部狀態BB");
// 當前狀態
System.out.println("修改當前狀態:" + originator);
// 對當前狀態進行還原
originator.revert(mementoClass);
// 還原後的狀態
System.out.println("還原後狀態:" + originator);
}
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 發起人,負責創建一個備忘錄Memento,用於記錄當前時刻它的狀態,並可使用備忘錄模式恢復狀態
* 該類可以決定Memento備忘錄對象存放哪些內部狀態信息
*/
class Originator {
// 內部狀態A
private String stateA;
// 內部狀態B
private String stateB;
// 創建一個當前時刻副本
public MementoClass createMementoClass() {
return new MementoClass(stateA, stateB);
}
// 恢復指定副本
public void revert(MementoClass mementoClass) {
this.stateA = mementoClass.getStateA();
this.stateB = mementoClass.getStateB();
}
public void setStateA(String stateA) {
this.stateA = stateA;
}
public void setStateB(String stateB) {
this.stateB = stateB;
}
@Override
public String toString() {
return "Originator [stateA=" + stateA + ", stateB=" + stateB + "]";
}
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 備忘錄:可以保存一些想要保存的信息
*/
class MementoClass {
// 保存狀態A
private String stateA;
// 保存狀態B
private String stateB;
public MementoClass(String stateA, String stateB) {
this.stateA = stateA;
this.stateB = stateB;
}
@Override
public String toString() {
return "MementoClass [stateA=" + stateA + ", stateB=" + stateB + "]";
}
public String getStateA() {
return stateA;
}
public String getStateB() {
return stateB;
}
}
測試結果:
後分析
- 個人建議:寫代碼是件幸福的事,So,do it
備忘錄模式,定義是:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。
根據上面的代碼可以看出來,MementoClass就是負責保存某一時刻狀態的對象。這個類中的屬性可以根據我們的需要進行有選擇性、針對性的保存。該模式比較適用於功能比較複雜,但需要維護或記錄屬性歷史的類,或者需要保存的屬性只是衆多屬性中的一小部分,當角色的狀態改變時,有可能這個狀態無效,這時候就可以使用暫時存儲起來的備忘錄將狀態復原。當然這個暫時的備忘錄如果想要其比較穩定,不會因爲內存太小等因素保存失敗等,可將其保存在硬盤上。
與原型模式的差別:原型模式強調的是對象原封不動的複製/克隆,而備忘錄模式講究的是將對象中某一時刻的內部狀態備份/部分備份。
其他例子:參考自《大話設計模式》遊戲備份及回到某一個備份時刻。
注:以上文章僅是個人總結,若有不當之處,望不吝賜教