备忘录模式

概念

在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。

代码实现

PlayData.java

package pattern.memento.videomemento.originator;

import pattern.memento.videomemento.memento.PlayDataMemento;

/**
 * 〈功能详细描述〉源发器类
 *
 * @author 刘斌
 * @date 2020/2/16
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class PlayData {
    private String videoName;//影剧名字
    private String playTime;//影剧播放时间

    //1、get和 set方法
    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;
    }
    //2、构造器
    public PlayData(String videoName, String playTime) {
        this.videoName = videoName;
        this.playTime = playTime;
    }

    //3、忘录对象的创建
    public PlayDataMemento playDataMemento() {
        return new PlayDataMemento(this);
    }

    //4、数据恢复
    public void resumePalyData(PlayDataMemento playDataMemento) {
        this.videoName = playDataMemento.getVideoName();
        this.playTime = playDataMemento.getPlayTime();
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("PlayData{");
        sb.append("videoName='").append(videoName).append('\'');
        sb.append(", playTime='").append(playTime).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

PlayDataMemento.java

package pattern.memento.videomemento.memento;

import pattern.memento.videomemento.originator.PlayData;

/**
 * 〈功能详细描述〉源发器类的备忘录类,保存影片的进度
 *
 * @author 刘斌
 * @date 2020/2/16
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class PlayDataMemento {

    private String videoName;//影剧名字
    private String playTime;//影剧播放时间

    private PlayData playData;

    public PlayDataMemento(PlayData playData) {
        this.videoName = playData.getVideoName();
        this.playTime=playData.getPlayTime();
    }

    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;
    }



    public PlayData getPlayData() {
        return playData;
    }

    public void setPlayData(PlayData playData) {
        this.playData = playData;
    }

}

VideoCareTaker.java

package pattern.memento.videomemento.caretaker;

import pattern.memento.videomemento.memento.PlayDataMemento;

import java.util.Stack;

/**
 * 〈功能详细描述〉
 *
 * @author 刘斌
 * @date 2020/2/16
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class VideoCareTaker {
    //负责人类当中设置一个备忘点
    private PlayDataMemento playDataMemento;

    //负责人类当中设置多个备忘点的时候,可以使用栈stack
    private Stack playDataMementoStack = new Stack<>();

    public PlayDataMemento getPlayDataMemento() {
        return playDataMemento;
    }

    public void setPlayDataMemento(PlayDataMemento playDataMemento) {
        this.playDataMemento = playDataMemento;
    }


    public void setPlayDataMementoStack(PlayDataMemento playDataMemento) {
        playDataMementoStack.push(playDataMemento);
    }


    public PlayDataMemento getPlayDataMementoStack() {
        if (!playDataMementoStack.empty()) {
            playDataMementoStack.pop();
            try {
                return get();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    public PlayDataMemento get() throws Exception {
        if (playDataMementoStack.size() == 0) {
            throw new Exception("暂存区没有数据...");
        }
        PlayDataMemento playDataMemento = playDataMementoStack.get(playDataMementoStack.size() - 1);
        return playDataMemento;
    }
}

Client.java

package pattern.memento.videomemento;

import pattern.memento.videomemento.caretaker.VideoCareTaker;
import pattern.memento.videomemento.originator.PlayData;

/**
 * 〈功能详细描述〉
 *
 * @author 刘斌
 * @date 2020/2/16
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class Client {
    public static void main(String[] args) {
        recoveryDataByMoreTime();
    }

    private static void recoveryDataByOnce() {
        //1、负责人类
        VideoCareTaker videoCareTaker = new VideoCareTaker();

        // 2、第一次播放红楼梦
        PlayData playData = new PlayData("红楼梦", "2020-02-20 12:00:00");
        System.out.println("第一次播放的影片信息为====》" + playData);

        //3、对该对象进行备忘
        videoCareTaker.setPlayDataMemento(playData.playDataMemento());

        // 4、第二次给切换到三国演义
        playData.setVideoName("三国演义");
        playData.setPlayTime("2020-02-20 15:00:00");
        System.out.println("第二次播放的影片信息为====》" + playData);

        //5、给恢复到原来第一次的红楼梦
        playData.resumePalyData(videoCareTaker.getPlayDataMemento());
        System.out.println("恢复到原来的影片====》" + playData);
    }

    private static void recoveryDataByMoreTime() {
        //1、负责人类
        VideoCareTaker videoCareTaker = new VideoCareTaker();

        // 2、第一次播放红楼梦
        PlayData playData = new PlayData("红楼梦", "2020-02-20 12:00:00");
        System.out.println("第一次播放的影片信息为====》" + playData);
        videoCareTaker.setPlayDataMementoStack(playData.playDataMemento());
        //3、第二次播放水浒传
        playData.setVideoName("水浒传");
        playData.setPlayTime("2020-02-20 15:00:00");
        System.out.println("第二次播放的影片信息为====》" + playData);
        videoCareTaker.setPlayDataMementoStack(playData.playDataMemento());

        //4、第三次播放 快乐大本营
        playData.setVideoName("快乐大本营");
        playData.setPlayTime("2020-02-20 20:00:00");
        System.out.println("第三次播放的影片信息为====》" + playData);
        videoCareTaker.setPlayDataMementoStack(playData.playDataMemento());

        //恢复前两次
        playData.resumePalyData(videoCareTaker.getPlayDataMementoStack());
        playData.resumePalyData(videoCareTaker.getPlayDataMementoStack());
        System.out.println("恢复到原来的影片====》" + playData);
    }
}

控制台输出结果

备忘录模式_第1张图片

你可能感兴趣的:(#,设计模式)