この記事の出所: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、中核的な役割
- 覚書の役割
オブジェクトの状態、すなわち発信内部状態を記録管理する責任。
- スポンサーの役割
現在の内部状態を含むメモオブジェクトを作成し、状態を保存するために使用。
- ガーディアンオブジェクト
複数のメモオブジェクトを維持する責任合理的な方法を、提供します。
図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