Java描述设计模式(24):备忘录模式
生活随笔
收集整理的這篇文章主要介紹了
Java描述设计模式(24):备忘录模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文源碼:GitHub·點這里 || GitEE·點這里
一、生活場景
1、場景描述
常見的視頻播放軟件都具備這樣一個功能:假設在播放視頻西游記,如果這時候切換播放視頻紅樓夢,當再次切回播放西游記時,視頻會從上次切走的時間點繼續播放。下面基于備忘錄設計模式來描述該場景流程。
2、場景圖解
3、代碼實現
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("紅樓夢","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("===切回上個視頻===");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() ;} } /*** 播放進度*/ 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) ;} } /*** 播放狀態描述*/ 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;} }執行效果:
正在播放:西游記:19:19 ===切換播放視頻=== 正在播放:紅樓夢:29:19 ===切回上個視頻=== 正在播放:西游記:19:19二、備忘錄模式
1、基礎概念
備忘錄模式屬于行為型模式,其用意在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。后續可將該對象恢復到原先保存的狀態。備忘錄對象主要用來記錄一個對象的某種狀態,或者某些數據,當要做回退時,可以從備忘錄對象里獲取原來的數據進行恢復操作。
2、模式圖解
3、核心角色
- 備忘錄角色
負責保存對象狀態的記錄,即Originator內部狀態。
- 發起人角色
創建一個含有當前的內部狀態的備忘錄對象,用來保存狀態。
- 守護者對象
提供合理的方式,負責保存多個備忘錄對象。
4、源碼實現
public class C02_Memento {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("狀態1:State01");caretaker.add(originator.saveStateMemento());originator.setState("狀態2:State02");caretaker.add(originator.saveStateMemento());System.out.println("當前的狀態是 =" + originator.getState());// 恢復狀態originator.getStateFromMemento(caretaker.get(0));System.out.println("當前的狀態是 =" + originator.getState());} } /*** 守護者對象*/ 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;} } /*** 發起人角色*/ 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();} }三、模式總結
1、優缺點描述
備忘錄模式提供一種可以恢復狀態的機制,實現狀態的封裝,能夠比較方便地回到某個歷史的狀態;常常與命令模式和迭代器模式一同使用。如果類的成員變量過多,會占用比較大的內存資源,為了節約內存,備忘錄模式可以和原型模式配合使用。
2、應用場景
- 瀏覽器的前進和回退;
- 數據庫備份與還原;
- 編輯器Ctrl+Z撤銷;
- 虛擬機生成快照與恢復;
- Git版本管理,代碼的提交和回滾。
四、源代碼地址
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent總結
以上是生活随笔為你收集整理的Java描述设计模式(24):备忘录模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发点去大唐芙蓉园的pp
- 下一篇: 儿子说,我也要上班