備忘錄模式(Memento Pattern)是一種行為型設計模式,它允許在不破壞封裝性的前提下,捕獲並保存一個對象的內部狀態,並在之後可以恢復該物件到先前的狀態.該模式的核心是備忘錄(Memento)類別,它儲存了一個物件的內部狀態.
在Java中,備忘錄模式可以透過定義一個備忘錄類別來實現.備忘錄類別通常包含一個或多個私有字段來儲存要保存的對象的內部狀態.備忘錄類別還可以提供公共方法來獲取和設置這些字段.原始對象可以使用備忘錄類創建備忘錄,並將其保存到歷史記錄中.在需要恢復物件的狀態時,原始物件可以從歷史記錄中取得備忘錄,並使用備忘錄來恢復其狀態.
#在備忘錄模式中,一般會涉及到以下三個角色:
#Originator(發起人):它是要被保存狀態的物件.它提供了建立備忘錄和復原備忘錄的介面,允許其他物件取得其內部狀態.
Memento(備忘錄):它用於儲存Originator內部狀態得對象.備忘錄可以根據Originator得需求來保存其內部狀態,並且可以防止Originator以外得其他對象訪問該狀態.
#Caretaker(管理者):它負責保存備忘錄,並在需要時將其提供給Originator進行恢復,Caretaker可以儲存多個備忘錄,以及支援多次撤銷操作.
在Java中實作備忘錄模式時,一般會涉及到以上三個角色.其中Originator和Memento是必需的,Caretaker可以根據實際需要來選擇是否實作.
假設有一個遊戲角色類別Role,它有三個屬性:attack(攻擊力),defense(防禦力)和hp(生命值).現在我們要實現一個備忘錄模式,可以保存角色的狀態,並在需要時恢復角色的狀態.
@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; } }
@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; } /** * 将当前对象储存值Memento中 * @return */ public Memento save(){ return new Memento(attack,defense,hp); } /** * 从memento中获取状态;并恢复到当前状态 * @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); } }
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)); // 恢复 role.restore(caretaker.getMemento(0)); System.out.println(JSON.toJSONString(role)); } }
以上是如何利用Java備忘錄模式來保存和復原物件狀態?的詳細內容。更多資訊請關注PHP中文網其他相關文章!