zgq105 / blog

2 stars 0 forks source link

设计模式之备忘录模式 #54

Open zgq105 opened 5 years ago

zgq105 commented 5 years ago

image

1. 什么是备忘录模式?有什么作用?

备忘录模式指保存一个对象的状态,以确保在适当的时候恢复对象;它属于行为型设计模式。它的主要作用就是通过保存对象的状态,使得它可以恢复到对象的某个状态。比如像浏览器的回退、数据库事务机制等。

2. 如何实现?

以视频播放为例实现简单的备忘录模式,假设视频播放有开始播放、 播放中、暂停播放、播完完毕四种状态,实现代码如下: //创建备忘录

/**
 * Created by zgq on 2019/6/2 22:12
 * 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态
 */
public class VideoPlay {
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

//创建发起人角色

/**
 * Created by zgq on 2019/6/2 22:16
 * 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据
 */
public class VideoOriginator {

    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public VideoOriginator() {
        this.state = "开始播放";
    }

    /**
     * 创建
     *
     * @return
     */
    public VideoPlay createVideoPlay() {
        VideoPlay videoPlay = new VideoPlay();
        videoPlay.setState(this.state);
        return videoPlay;
    }

    /**
     * 恢复到某个状态
     *
     * @param videoPlay
     */
    public void restore(VideoPlay videoPlay) {
        this.state = videoPlay.getState();
    }
}

//创建管理角色

/**
 * Created by zgq on 2019/6/2 22:25
 * //管理角色:对备忘录进行管理,保存和提供备忘录
 */
public class VideoCaretaker {
    private VideoPlay videoPlay;

    public VideoPlay getVideoPlay() {
        return videoPlay;
    }

    public void setVideoPlay(VideoPlay videoPlay) {
        this.videoPlay = videoPlay;
    }
}

//使用备忘录模式

        //发起人
        VideoOriginator videoOriginator = new VideoOriginator();
        //管理角色
        VideoCaretaker videoCaretaker = new VideoCaretaker();

        videoCaretaker.setVideoPlay(videoOriginator.createVideoPlay());
        System.out.println(videoOriginator.getState());

        videoCaretaker.getVideoPlay().setState("播放中");
        videoOriginator.restore(videoCaretaker.getVideoPlay());
        System.out.println(videoOriginator.getState());

        videoCaretaker.getVideoPlay().setState("暂停播放");
        videoOriginator.restore(videoCaretaker.getVideoPlay());
        System.out.println(videoOriginator.getState());

3. JDK或Android的应用举例

在JDK中,java.util.Date和数据库事务操作使用了备忘录模式;在Android中,Activity#onSaveInstanceState中使用了备忘录模式来恢复数据状态。

4. 小结

备忘录模式主要用于解决需要跟踪数据状态的场景,比如IDE中的回退操作、数据库的事务操作、编辑回退操作等。主要需要了解清楚备忘录角色、发起者角色和管理者角色;备忘录指数据对象本身,其内部主要有个状态标识;而发起者角色主要是负责备忘录的创建和恢复备忘录数据;而管理者角色主要对备忘录进行管理,保存和提供备忘录。 优点:

缺点: