Java設(shè)計(jì)模式之備忘錄模式詳解
Java備忘錄模式
游戲角色狀態(tài)恢復(fù)問(wèn)題
游戲角色有攻擊力和防御力,在大戰(zhàn)boss之前保存自身的狀態(tài)(攻擊力血量等等),當(dāng)大戰(zhàn)boss后攻擊力和防御力下降,從備忘錄對(duì)象恢復(fù)到大戰(zhàn)前的狀態(tài)
傳統(tǒng)的方式問(wèn)題分析
1.一個(gè)對(duì)象,就對(duì)應(yīng)一個(gè)保存對(duì)象狀態(tài)的對(duì)象,這樣當(dāng)我們游戲的對(duì)象很多時(shí),不利于管理,開銷也很大
2.傳統(tǒng)的方式是簡(jiǎn)單的備份,new出另外一個(gè)對(duì)象出來(lái),再把需要備份的數(shù)據(jù)放到這個(gè)新對(duì)象,但這樣就暴露了對(duì)象的內(nèi)部細(xì)節(jié)
解決方案 : 備忘錄模式
模式基本介紹:
1.備忘錄模式(Memento Pattern)在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài)并在該對(duì)象之外保存這個(gè)狀態(tài),這樣以后就可以將該對(duì)象恢復(fù)到原先保存的狀態(tài)
2.可以這里理解備忘錄模式顯示生活中的備忘錄模式是用來(lái)記錄某些要去做的事情或者是記錄已經(jīng)打成的共同意見的事情,以防忘記了。而在軟件層面,備忘錄模式有著相同的含義,備忘錄對(duì)象主要用來(lái)獲取一個(gè)對(duì)象的某種狀態(tài),或者某些數(shù)據(jù),當(dāng)要做回退時(shí),可以從備忘錄對(duì)象里獲取原來(lái)的數(shù)據(jù)進(jìn)行恢復(fù)操作
3.備忘錄模式屬于行為型模式
備忘錄模式類圖對(duì)象說(shuō)明
1.originator:對(duì)象(需要保存狀態(tài)的對(duì)象)
2.Memento:備忘錄對(duì)象,負(fù)責(zé)保存好記錄即Originator的內(nèi)部狀態(tài)
3.Caretaker:守護(hù)者對(duì)象,負(fù)責(zé)保存多個(gè)備忘錄對(duì)象,使用集合管理,提高效率
4.如果希望保存多個(gè)Originator對(duì)象的不同時(shí)間的狀態(tài)也可以,只需要HashMap<String,集合>
游戲角色恢復(fù)狀態(tài)實(shí)例
備忘錄對(duì)象
/**
* @create: 2021/10/16
* @author: Tony Stark
*/
public class Memento {
private String state;
public Memento(String state) {
this.state=state;
}
public String getState() {
return state;
}
}源對(duì)象
/**
* @create: 2021/10/16
* @author: Tony Stark
*/
public class Originator {
private String state;
public Memento saveState(){
return new Memento(state);
}
public void getStateMemento(Memento memento){
state=memento.getState();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}管理備忘錄對(duì)象的類
符合迪米特法則
/**
* @create: 2021/10/16
* @author: Tony Stark
*/
public class Caretaker {
private List<Memento> mementoList=new ArrayList<>();
public void add(Memento memento){
mementoList.add(memento);
}
public Memento getIndex(int index){
return mementoList.get(index);
}
}調(diào)用測(cè)試
/**
* @create: 2021/10/16
* @author: Tony Stark
*/
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState("血量100%");
System.out.println(originator.getState());
System.out.println("保存當(dāng)前血量");
caretaker.add(originator.saveState());
System.out.println("團(tuán)戰(zhàn)中------->團(tuán)戰(zhàn)結(jié)束");
originator.setState("血量50%");
System.out.println("剩余血量為------->"+originator.getState());
originator.getStateMemento(caretaker.getIndex(0));
System.out.println("回基地補(bǔ)充血量---->血量恢復(fù)為---"+originator.getState());
}
}輸出
血量100%
保存當(dāng)前血量
團(tuán)戰(zhàn)中------->團(tuán)戰(zhàn)結(jié)束
剩余血量為------->血量50%
回基地補(bǔ)充血量---->血量恢復(fù)為---血量100%
備忘錄模式的注意事項(xiàng)和細(xì)節(jié)
1.給用戶提供了一種可以恢復(fù)狀態(tài)的機(jī)制,可以使用戶能夠比較方便的回到某個(gè)歷史的狀態(tài)
2.實(shí)現(xiàn)了信息的封裝,使用戶不需要關(guān)心狀態(tài)的保存細(xì)節(jié)
3.如果類的成員變量過(guò)多,勢(shì)必會(huì)占用比較大的資源,而且每一次保存都會(huì)消耗一定的內(nèi)存,這個(gè)需要注意
4.適用的應(yīng)用場(chǎng)景1.后悔藥 2.游戲的存檔3.Windows里的Ctri+z撤銷 4.IE中的后退5.數(shù)據(jù)庫(kù)的事務(wù)管理
5.為了節(jié)約內(nèi)存,備忘錄模式可以和原型模式配合使用
到此這篇關(guān)于Java設(shè)計(jì)模式之備忘錄模式詳解的文章就介紹到這了,更多相關(guān)Java備忘錄模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot ActiveMQ如何設(shè)置訪問(wèn)密碼
這篇文章主要介紹了Spring Boot ActiveMQ如何設(shè)置訪問(wèn)密碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Java無(wú)限級(jí)樹(遞歸)超實(shí)用案例
下面小編就為大家?guī)?lái)一篇Java無(wú)限級(jí)樹(遞歸)超實(shí)用案例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
解決springboot中mongodb不啟動(dòng)及Dao不能被掃描到的問(wèn)題
這篇文章主要介紹了解決springboot中mongodb不啟動(dòng)及Dao不能被掃描到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringBoot 下的 Static 文件夾打包成前端資源的示例代碼
這篇文章主要介紹了SpringBoot 下的 Static 文件夾如何打包成前端資源,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
java自定義驗(yàn)證器的實(shí)現(xiàn)示例
在對(duì)外暴露接口中,我們通常會(huì)對(duì)入?yún)⑦M(jìn)行驗(yàn)證,比如一些字符串非空判斷等,本文主要介紹了java自定義驗(yàn)證器的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Java?EasyExcel創(chuàng)建復(fù)雜表格的完整指南
WriteTable?是?EasyExcel?庫(kù)中的一個(gè)核心組件,用于在同一個(gè)?Excel?表單(Sheet)內(nèi)創(chuàng)建多個(gè)獨(dú)立的表格區(qū)域,下面我們來(lái)看看如何使用WriteTable創(chuàng)建復(fù)雜表格吧2025-12-12
Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的相關(guān)資料,wait()是Object類中的方法,而sleep()是Thread類中的靜態(tài)方法,wait()方法用于多個(gè)線程之間的協(xié)作和通信,而sleep()方法用于線程的休眠,需要的朋友可以參考下2024-07-07

