您好,登錄后才能下訂單哦!
本文源碼:GitHub·點這里 || GitEE·點這里
常見的視頻播放軟件都具備這樣一個功能:假設在播放視頻西游記,如果這時候切換播放視頻紅樓夢,當再次切回播放西游記時,視頻會從上次切走的時間點繼續播放。下面基于備忘錄設計模式來描述該場景流程。
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
備忘錄模式屬于行為型模式,其用意在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。后續可將該對象恢復到原先保存的狀態。備忘錄對象主要用來記錄一個對象的某種狀態,或者某些數據,當要做回退時,可以從備忘錄對象里獲取原來的數據進行恢復操作。
負責保存對象狀態的記錄,即Originator內部狀態。
創建一個含有當前的內部狀態的備忘錄對象,用來保存狀態。
提供合理的方式,負責保存多個備忘錄對象。
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();
}
}
備忘錄模式提供一種可以恢復狀態的機制,實現狀態的封裝,能夠比較方便地回到某個歷史的狀態;常常與命令模式和迭代器模式一同使用。如果類的成員變量過多,會占用比較大的內存資源,為了節約內存,備忘錄模式可以和原型模式配合使用。
Ctrl+Z
撤銷;GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。