生活随笔
收集整理的這篇文章主要介紹了
24【备忘录设计模式】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 二十四、備忘錄設計模式
- 24.1 備忘錄設計模式簡介
- 24.1.1 備忘錄設計模式概述
- 24.1.2 備忘錄設計模式的UML類圖
- 24.2. 備忘錄設計模式的實現
- 24.3 備忘錄設計模式的優缺點
二十四、備忘錄設計模式
24.1 備忘錄設計模式簡介
24.1.1 備忘錄設計模式概述
備忘錄設計模式(Memento Pattern):又稱快照模式(Snapshot Pattern),在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,以便以后當需要時能將該對象恢復到原先保存的狀態。
備忘錄模式提供了一種狀態恢復的實現機制,它通過存儲系統各個歷史狀態的快照,使得在任何一時刻都可以將系統回退到某一個歷史狀態;
【場景舉例】
備忘錄在我們生活中很容易遇見
- 例1:例如我們打一些單機游戲的時候,游戲會提供一些存檔功能,我們可以選擇存檔,下次就可以接著這個存檔繼續玩游戲了;也可以將當前的游戲狀態回退到歷史的某一個存檔;
- 例2:我們使用的VM虛擬機里面就很好的運用到了“備忘錄設計模式”,在使用VM時,可以針對某個操作拍下快照,以防以后誤操作時還可以回退到這個狀態;
上述都是“備忘錄設計模式”的應用場景
24.1.2 備忘錄設計模式的UML類圖
備忘錄設計模式主要有3個角色:
- 1)發起人角色(Originator):負責讀取備忘錄角色的信息生成一個狀態,或者讀取管理角色的備忘錄信息來回滾到某個狀態;
- 2)備忘錄角色(Memento):用于存儲備忘錄的一些具體信息,如要將什么信息交給發起人(Originator)保存;
- 3)管理者角色(Caretaker):對備忘錄的管理,如存儲一個備忘錄、讀取從歷史存檔中讀取一個備忘錄等,提供備忘錄的存儲;
24.2. 備忘錄設計模式的實現
【案例】
提供游戲的存檔功能、回檔功能等;
下面我們使用備忘錄設計模式來實現案例功能;
package com.pattern.demo01;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GameMemento {private String level
;private String money
;private String gamePlan
;
}
package com.pattern.demo01;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GamePlayOriginator {private String level
;private String money
;private String gamePlan
;public void showGameData() {System.out
.println("游戲等級【" + level
+ "】," +"游戲金幣【" + money
+ "】," +"游戲關卡【" + gamePlan
+ "】");System.out
.println("----------------------");}public GameMemento saveGameMemento() {GameMemento gameMemento
= new GameMemento(level
, money
, gamePlan
);return gameMemento
;}public void backGameMemento(GameMemento gameMemento
) {this.level
= gameMemento
.getLevel();this.money
= gameMemento
.getMoney();this.gamePlan
= gameMemento
.getGamePlan();}
}
package com.pattern.demo01;import java.util.HashMap;
public class GameCaretaker {private HashMap<String,GameMemento> mementoMaps
=new HashMap<>();public GameMemento getMemento(String key
) {return mementoMaps
.get(key
);}public void setMemento(String key
,GameMemento memento
) {mementoMaps
.put(key
,memento
);}
}
package com.pattern.demo01;
public class Demo01 {public static void main(String[] args
) {GamePlayOriginator gamePlayOriginator
= new GamePlayOriginator();gamePlayOriginator
.setMoney("2000$");gamePlayOriginator
.setGamePlan("第五關");gamePlayOriginator
.setLevel("Lv15");gamePlayOriginator
.showGameData();GameMemento gameMemento
= gamePlayOriginator
.saveGameMemento();GameCaretaker gameCaretaker
=new GameCaretaker();gameCaretaker
.setMemento("1",gameMemento
);gamePlayOriginator
.setMoney("7000$");gamePlayOriginator
.setGamePlan("第九關");gamePlayOriginator
.setLevel("Lv18");gamePlayOriginator
.showGameData();GameMemento memento18
= gamePlayOriginator
.saveGameMemento();gameCaretaker
.setMemento("2",memento18
);gamePlayOriginator
.setMoney("12000$");gamePlayOriginator
.setGamePlan("第十五關");gamePlayOriginator
.setLevel("Lv27");gamePlayOriginator
.showGameData();GameMemento memento
= gameCaretaker
.getMemento("1");gamePlayOriginator
.backGameMemento(memento
);gamePlayOriginator
.showGameData();}
}
運行效果:
24.3 備忘錄設計模式的優缺點
- 優點
- 1)提供了一種可以恢復狀態的機制。當用戶需要時能夠比較方便地將數據恢復到某個歷史的狀態。
- 2)簡化發起人的職責,隔離狀態與存檔、回檔,實現信息的封裝,客戶端無需關系狀態的保存細節
- 缺點:
- 1)備忘錄設計模式的主要缺點就是消耗資源,如果需要保存的狀態過多,則每一次保存都會消耗很多內存
總結
以上是生活随笔為你收集整理的24【备忘录设计模式】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。