Java描述设计模式(24):备忘录模式
本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里
一、生活場(chǎng)景
1、場(chǎng)景描述
常見(jiàn)的視頻播放軟件都具備這樣一個(gè)功能:假設(shè)在播放視頻西游記,如果這時(shí)候切換播放視頻紅樓夢(mèng),當(dāng)再次切回播放西游記時(shí),視頻會(huì)從上次切走的時(shí)間點(diǎn)繼續(xù)播放。下面基于備忘錄設(shè)計(jì)模式來(lái)描述該場(chǎng)景流程。
2、場(chǎng)景圖解
3、代碼實(shí)現(xiàn)
public class C01_InScene {public static void main(String[] args) {Record record = new Record() ;Player player = new Player() ;PlayData pd1 = new PlayData("西游記","19:19") ;PlayData pd2 = new PlayData("紅樓夢(mèng)","29:19") ;player.setPlayData(pd1);player.saveProgress() ;System.out.println("正在播放:"+player.getPlayData().getVideoName()+":"+player.getPlayData().getPlayTime());record.put(new Progress(pd1));System.out.println("===切換播放視頻===");player.setPlayData(pd2);player.saveProgress() ;System.out.println("正在播放:"+player.getPlayData().getVideoName()+":"+player.getPlayData().getPlayTime());record.put(new Progress(pd1));System.out.println("===切回上個(gè)視頻===");player.resumeProgress(record.get(pd1.getVideoName()));System.out.println("正在播放:"+player.getPlayData().getVideoName()+":"+player.getPlayData().getPlayTime());} } /*** 視頻播放器*/ class Player {private PlayData playData ;public PlayData getPlayData() {return playData;}public void setPlayData(PlayData playData) {this.playData = playData;}public Progress saveProgress (){return new Progress(playData) ;}public void resumeProgress (Progress progress){playData = progress.getPlayData() ;} } /*** 播放進(jìn)度*/ class Progress {private PlayData playData ;public Progress (PlayData playData){this.playData = playData ;}public PlayData getPlayData() {return playData ;} } /*** 播放記錄*/ class Record {private Map<String,Progress> dataMap = new HashMap<>() ;public void put (Progress progress){dataMap.put(progress.getPlayData().getVideoName(),progress) ;}public Progress get (String videoName){return dataMap.get(videoName) ;} } /*** 播放狀態(tài)描述*/ class PlayData {private String videoName ;private String playTime ;public PlayData(String videoName, String playTime) {this.videoName = videoName;this.playTime = playTime;}public String getVideoName() {return videoName;}public void setVideoName(String videoName) {this.videoName = videoName;}public String getPlayTime() {return playTime;}public void setPlayTime(String playTime) {this.playTime = playTime;} }執(zhí)行效果:
正在播放:西游記:19:19 ===切換播放視頻=== 正在播放:紅樓夢(mèng):29:19 ===切回上個(gè)視頻=== 正在播放:西游記:19:19二、備忘錄模式
1、基礎(chǔ)概念
備忘錄模式屬于行為型模式,其用意在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。后續(xù)可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。備忘錄對(duì)象主要用來(lái)記錄一個(gè)對(duì)象的某種狀態(tài),或者某些數(shù)據(jù),當(dāng)要做回退時(shí),可以從備忘錄對(duì)象里獲取原來(lái)的數(shù)據(jù)進(jìn)行恢復(fù)操作。
2、模式圖解
3、核心角色
- 備忘錄角色
負(fù)責(zé)保存對(duì)象狀態(tài)的記錄,即Originator內(nèi)部狀態(tài)。
- 發(fā)起人角色
創(chuàng)建一個(gè)含有當(dāng)前的內(nèi)部狀態(tài)的備忘錄對(duì)象,用來(lái)保存狀態(tài)。
- 守護(hù)者對(duì)象
提供合理的方式,負(fù)責(zé)保存多個(gè)備忘錄對(duì)象。
4、源碼實(shí)現(xiàn)
public class C02_Memento {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("狀態(tài)1:State01");caretaker.add(originator.saveStateMemento());originator.setState("狀態(tài)2:State02");caretaker.add(originator.saveStateMemento());System.out.println("當(dāng)前的狀態(tài)是 =" + originator.getState());// 恢復(fù)狀態(tài)originator.getStateFromMemento(caretaker.get(0));System.out.println("當(dāng)前的狀態(tài)是 =" + originator.getState());} } /*** 守護(hù)者對(duì)象*/ class Caretaker {private List<Memento> mementoList = new ArrayList<>();public void add(Memento memento) {mementoList.add(memento);}public Memento get (int index) {return mementoList.get(index);} } /*** 備忘錄角色*/ class Memento {private String state;public Memento(String state) {super();this.state = state;}public String getState() {return state;} } /*** 發(fā)起人角色*/ class Originator {private String state;public String getState() {return state;}public void setState(String state) {this.state = state;}public Memento saveStateMemento() {return new Memento(state);}public void getStateFromMemento(Memento memento) {state = memento.getState();} }三、模式總結(jié)
1、優(yōu)缺點(diǎn)描述
備忘錄模式提供一種可以恢復(fù)狀態(tài)的機(jī)制,實(shí)現(xiàn)狀態(tài)的封裝,能夠比較方便地回到某個(gè)歷史的狀態(tài);常常與命令模式和迭代器模式一同使用。如果類的成員變量過(guò)多,會(huì)占用比較大的內(nèi)存資源,為了節(jié)約內(nèi)存,備忘錄模式可以和原型模式配合使用。
2、應(yīng)用場(chǎng)景
- 瀏覽器的前進(jìn)和回退;
- 數(shù)據(jù)庫(kù)備份與還原;
- 編輯器Ctrl+Z撤銷;
- 虛擬機(jī)生成快照與恢復(fù);
- Git版本管理,代碼的提交和回滾。
四、源代碼地址
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent總結(jié)
以上是生活随笔為你收集整理的Java描述设计模式(24):备忘录模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 发点去大唐芙蓉园的pp
- 下一篇: 儿子说,我也要上班