設計模式從入門到精通 18 備忘錄模式

2022-09-14 22:03:29 字數 3414 閱讀 7159

目錄遊戲魚色有攻擊力和防禦力,在大戰 boss 前儲存自身的狀態(攻擊力和防禦力),當大戰 boss 後攻擊力和防禦萬下降,從備忘錄物件恢復到大戰前的狀態

傳統方案

傳統方案問題分析

原理類圖

示例**

/**

* 源物件

*/public class originator

public void setstate(string state)

public memento createmementor()

public void revertstatefrommementor(memento memento)

}/**

* 備忘錄物件

*/public class memento

public string getstate()

}/**

* 守護者物件

*/public class caretaker

public memento getmemento(integer index)

}

測試**

originator originator = new originator();

caretaker caretaker = new caretaker();

originator.setstate("當前狀態:" + " 狀態#1 血量 100 ");

caretaker.addmemento(originator.createmementor());

system.out.println(originator.getstate());

originator.setstate("當前狀態:" + " 狀態#2 血量 80 ");

caretaker.addmemento(originator.createmementor());

system.out.println(originator.getstate());

originator.setstate("當前狀態:" + " 狀態#3 血量 60 ");

caretaker.addmemento(originator.createmementor());

system.out.println(originator.getstate());

// 恢復到狀態1

originator.revertstatefrommementor(caretaker.getmemento(0));

system.out.println("恢復狀態:" + originator.getstate());

//當前狀態: 狀態#1 血量 100

//當前狀態: 狀態#2 血量 80

//當前狀態: 狀態#3 血量 60

//恢復狀態:當前狀態: 狀態#1 血量 100

備忘錄模式中的角色和職責uml 類圖

備忘錄物件

public class memento 

public integer getvit()

public void setvit(integer vit)

public integer getdef()

public void setdef(integer def)

}

守護者物件

public class caretaker 

public void setmemento(memento memento)

}

遊戲角色物件

public class gamerole 

public void setvit(integer vit)

public integer getdef()

public void setdef(integer def)

public memento creatememento()

public void recovermemento(memento memento)

public void display()

}

測試**

system.out.println("*****=大戰前狀態*****=");

gamerole gamerole = new gamerole();

gamerole.setvit(100);

gamerole.setdef(100);

caretaker caretaker = new caretaker();

caretaker.setmemento(gamerole.creatememento());

gamerole.display();

system.out.println("*****=大戰後狀態*****=");

gamerole.setvit(10);

gamerole.setdef(10);

gamerole.display();

system.out.println("*****=從備忘錄物件恢復到大戰前的狀態*****=");

gamerole.recovermemento(caretaker.getmemento());

gamerole.display();

//*****=大戰前狀態*****=

//遊戲角色當前攻擊力:100,當前防禦力:100

//*****=大戰後狀態*****=

//遊戲角色當前攻擊力:10,當前防禦力:10

//*****=從備忘錄物件恢復到大戰前的狀態*****=

//遊戲角色當前攻擊力:100,當前防禦力:100

優點缺點其他

18 備忘錄模式

package memento 以前的小霸王遊戲是不是可以儲存遊戲進度?是的 那是怎麼實現的呢?應該是.來 先簡單實現一下 public class commonly class gamerole 獲得初始狀態 public void getinitstate 戰鬥 public void figh...

18 備忘錄模式

在不破壞封裝的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存該狀態。這樣以後就可將該物件恢復到原先儲存的狀態 理解originator 原發器,使用備忘錄來儲存某個時刻原發器自身的狀態,也可以使用備忘錄來恢復內部狀態 memento 備忘錄,儲存原發器物件的內部狀態,原發器外部的物件不應該能訪問...

設計模式之18 備忘錄模式Memento

有時候我們需要記錄乙個物件的狀態,用於該物件在某些狀況下的恢復,這種模式 我們稱之為備忘錄模式。發起人 originator 需要備份的物件,將自身的屬性資訊拷貝到乙個備忘錄物件,並能夠通過備忘錄中的屬性資訊 進行恢復 備忘錄 memento 儲存發起人狀態,提供set,get介面進行狀態訪問 管理...