メモモード(24)に記載のJavaデザインパターン

この記事の出所: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

おすすめ

転載: www.cnblogs.com/cicada-smile/p/11946728.html