溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java描述設計模式(24):備忘錄模式

發(fā)布時間:2020-07-22 06:07:20 來源:網絡 閱讀:178 作者:知了一笑 欄目:編程語言

本文源碼:GitHub·點這里 || GitEE·點這里

一、生活場景

1、場景描述

常見的視頻播放軟件都具備這樣一個功能:假設在播放視頻西游記,如果這時候切換播放視頻紅樓夢,當再次切回播放西游記時,視頻會從上次切走的時間點繼續(xù)播放。下面基于備忘錄設計模式來描述該場景流程。

2、場景圖解

Java描述設計模式(24):備忘錄模式

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) ;
    }
}
/**
 * 播放狀態(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
===切換播放視頻===
正在播放:紅樓夢:29:19
===切回上個視頻===
正在播放:西游記:19:19

二、備忘錄模式

1、基礎概念

備忘錄模式屬于行為型模式,其用意在不破壞封裝性的前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài)。后續(xù)可將該對象恢復到原先保存的狀態(tài)。備忘錄對象主要用來記錄一個對象的某種狀態(tài),或者某些數據,當要做回退時,可以從備忘錄對象里獲取原來的數據進行恢復操作。

2、模式圖解

Java描述設計模式(24):備忘錄模式

3、核心角色

  • 備忘錄角色

負責保存對象狀態(tài)的記錄,即Originator內部狀態(tài)。

  • 發(fā)起人角色

創(chuàng)建一個含有當前的內部狀態(tài)的備忘錄對象,用來保存狀態(tài)。

  • 守護者對象

提供合理的方式,負責保存多個備忘錄對象。

4、源碼實現

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("當前的狀態(tài)是 =" + originator.getState());
        // 恢復狀態(tài)
        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("當前的狀態(tài)是 =" + 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;
    }
}
/**
 * 發(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();
    }
}

三、模式總結

1、優(yōu)缺點描述

備忘錄模式提供一種可以恢復狀態(tài)的機制,實現狀態(tài)的封裝,能夠比較方便地回到某個歷史的狀態(tài);常常與命令模式和迭代器模式一同使用。如果類的成員變量過多,會占用比較大的內存資源,為了節(jié)約內存,備忘錄模式可以和原型模式配合使用。

2、應用場景

  • 瀏覽器的前進和回退;
  • 數據庫備份與還原;
  • 編輯器Ctrl+Z撤銷;
  • 虛擬機生成快照與恢復;
  • Git版本管理,代碼的提交和回滾。

四、源代碼地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述設計模式(24):備忘錄模式

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI