本篇內(nèi)容主要講解“怎么使用Java備忘錄模式實(shí)現(xiàn)對(duì)象狀態(tài)的保存和恢復(fù)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么使用Java備忘錄模式實(shí)現(xiàn)對(duì)象狀態(tài)的保存和恢復(fù)”吧!
介紹
備忘錄模式(Memento Pattern)是一種行為型設(shè)計(jì)模式,它允許在不破壞封裝性的前提下,捕獲并保存一個(gè)對(duì)象的內(nèi)部狀態(tài),并在之后可以恢復(fù)該對(duì)象到先前的狀態(tài).該模式的核心是備忘錄(Memento)類,它儲(chǔ)存了一個(gè)對(duì)象的內(nèi)部狀態(tài).
在Java中,備忘錄模式可以通過(guò)定義一個(gè)備忘錄類來(lái)實(shí)現(xiàn).備忘錄類通常包含一個(gè)或多個(gè)私有字段來(lái)儲(chǔ)存要保存的對(duì)象的內(nèi)部狀態(tài).備忘錄類還可以提供公共方法來(lái)獲取和設(shè)置這些字段.原始對(duì)象可以使用備忘錄類創(chuàng)建備忘錄,并將其保存到歷史記錄中.在需要恢復(fù)對(duì)象的狀態(tài)時(shí),原始對(duì)象可以從歷史記錄中獲取備忘錄,并使用備忘錄來(lái)恢復(fù)其狀態(tài).
在備忘錄模式中,一般會(huì)涉及到以下三個(gè)角色:
Originator(發(fā)起人):它是要被保存狀態(tài)的對(duì)象.它提供了創(chuàng)建備忘錄和恢復(fù)備忘錄的接口,允許其他對(duì)象獲取其內(nèi)部狀態(tài).
Memento(備忘錄):它用于儲(chǔ)存Originator內(nèi)部狀態(tài)得對(duì)象.備忘錄可以根據(jù)Originator得需求來(lái)保存其內(nèi)部狀態(tài),并且可以防止Originator以外得其他對(duì)象訪問(wèn)該狀態(tài).
Caretaker(管理者):它負(fù)責(zé)保存?zhèn)渫?并在需要時(shí)將其提供給Originator進(jìn)行恢復(fù),Caretaker可以儲(chǔ)存多個(gè)備忘錄,以及支持多次撤銷操作.
在Java中實(shí)現(xiàn)備忘錄模式時(shí),一般會(huì)涉及到以上三個(gè)角色.其中Originator和Memento是必需的,Caretaker可以根據(jù)實(shí)際需要來(lái)選擇是否實(shí)現(xiàn).
實(shí)現(xiàn)
假設(shè)有一個(gè)游戲角色類Role,它有三個(gè)屬性:attack(攻擊力),defense(防御力)和hp(生命值).現(xiàn)在我們要實(shí)現(xiàn)一個(gè)備忘錄模式,可以保存角色的狀態(tài),并在需要時(shí)恢復(fù)角色的狀態(tài).
備忘錄類
@Data public?class?Memento?{ ????/** ?????*?攻擊力 ?????*/ ????private?int?attack; ????/** ?????*?防御力 ?????*/ ????private?int?defense; ????/** ?????*?生命值 ?????*/ ????private?int?hp; ????public?Memento(int?attack,?int?defense,?int?hp)?{ ????????this.attack?=?attack; ????????this.defense?=?defense; ????????this.hp?=?hp; ????} }
發(fā)起人類
@Data public?class?Role?{ ????/** ?????*?攻擊力 ?????*/ ????private?int?attack; ????/** ?????*?防御力 ?????*/ ????private?int?defense; ????/** ?????*?生命值 ?????*/ ????private?int?hp; ????public?Role(int?attack,?int?defense,?int?hp)?{ ????????this.attack?=?attack; ????????this.defense?=?defense; ????????this.hp?=?hp; ????} ????/** ?????*?將當(dāng)前對(duì)象儲(chǔ)存值Memento中 ?????*?@return ?????*/ ????public?Memento?save(){ ????????return?new?Memento(attack,defense,hp); ????} ????/** ?????*?從memento中獲取狀態(tài);并恢復(fù)到當(dāng)前狀態(tài) ?????*?@param?memento ?????*/ ????public?void?restore(Memento?memento){ ????????attack?=?memento.getAttack(); ????????defense?=?memento.getDefense(); ????????hp?=?memento.getHp(); ????} }
管理者類
public?class?Caretaker?{ ????private?List<Memento>?mementos?=?new?ArrayList<>(); ????public?void?addMemento(Memento?m){ ????????mementos.add(m); ????} ????public?Memento?getMemento(int?index){ ????????return?mementos.get(index); ????} }
測(cè)試
public?class?Demo?{ ????public?static?void?main(String[]?args)?{ ????????Role?role?=?new?Role(100,50,20); ????????Caretaker?caretaker?=?new?Caretaker(); ????????Memento?memento?=?role.save(); ????????caretaker.addMemento(memento); ????????//?攻擊力+10 ????????role.setAttack(role.getAttack()+10); ????????System.out.println(JSON.toJSONString(role)); ????????//?恢復(fù) ????????role.restore(caretaker.getMemento(0)); ????????System.out.println(JSON.toJSONString(role)); ????} }
可以實(shí)現(xiàn)對(duì)象狀態(tài)的保存和恢復(fù),使得對(duì)象狀態(tài)的變化更加靈活可控.
模式實(shí)現(xiàn)簡(jiǎn)單,易于理解和使用.
備忘錄對(duì)象和原始對(duì)象分離,保證了系統(tǒng)的封裝性.
缺點(diǎn)
如果要保存的狀態(tài)數(shù)據(jù)量比較大,備忘錄對(duì)象可能會(huì)占用較大的內(nèi)存空間.
如果需要保存的狀態(tài)比較頻繁,備忘錄對(duì)象的管理可能會(huì)變得比較復(fù)雜.
應(yīng)用場(chǎng)景
需要保存對(duì)象狀態(tài)的歷史記錄,以便后續(xù)回退到之前的某個(gè)狀態(tài),例如文本編輯器中的撤銷操作.
需要對(duì)對(duì)象狀態(tài)進(jìn)行備份和恢復(fù)的場(chǎng)景,例如數(shù)據(jù)庫(kù)中的事務(wù)管理.
需要實(shí)現(xiàn)對(duì)象狀態(tài)的快照,一邊后續(xù)進(jìn)行分析和統(tǒng)計(jì),例如游戲中存檔和回放功能.
總之Java備忘錄模式適用于需要保存和恢復(fù)對(duì)象狀態(tài)的場(chǎng)景,可以幫助開(kāi)發(fā)者更好地管理對(duì)象狀態(tài)的變化,提高系統(tǒng)的靈活性和可控性.
到此,相信大家對(duì)“怎么使用Java備忘錄模式實(shí)現(xiàn)對(duì)象狀態(tài)的保存和恢復(fù)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是***網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!