Java设计模式(二十一)备忘录模式

备忘录模式

定义

又称快照模式或令牌模式,是指在不破坏封装的前提下,不好一个对象的内部状态,并在对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态,属于行为模式。

在软件系统中,备忘录模式可以为我们提供一种“后悔药”的机制,它通过存储系统各个历史状态的快照,使得我们可以在任一时刻将系统回滚到某一个历史状态。

适用情景

  1. 需要保存历史快照的场景
  2. 希望在对象之外保存状态,且除了自己其他类对象无法访问状态保存具体内容。

角色

  1. 发起人(Originator):负责创建一个备忘录,记录自身需要保存的状态;具备状态回滚功能。
  2. 备忘录(Memento):由于存储Originator的内部状态,且可以防止Originator以外的对象进行访问。
  3. 备忘录管理员(Caretaker):负责存储,提供管理备忘录,无法对备忘录内容进行操作和访问。

实例

使用压栈管理落地备忘录模式

public class ArticleMemento {

    private String title;

    private String content;

    private String imgs;

    public ArticleMemento(String title, String content, String imgs) {
        this.title = title;
        this.content = content;
        this.imgs = imgs;
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }

    public String getImgs() {
        return imgs;
    }

    @Override
    public String toString() {
        return "ArticleMemento{" +
                "title='" + title + '\'' +
                ", content='" + content + '\'' +
                ", imgs='" + imgs + '\'' +
                '}';
    }
}

public class Editor {
    private String title;

    private String content;

    private String imgs;

    public Editor(String title, String content, String imgs) {
        this.title = title;
        this.content = content;
        this.imgs = imgs;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getImgs() {
        return imgs;
    }

    public void setImgs(String imgs) {
        this.imgs = imgs;
    }

    public ArticleMemento saveToMemento(){
        ArticleMemento articleMemento = new ArticleMemento(this.title,this.content, this.imgs);
        return articleMemento;
    }

    public void undoFromMemento(ArticleMemento articleMemento){
        this.title = articleMemento.getTitle();
        this.content = articleMemento.getContent();
        this.imgs = articleMemento.getImgs();
    }

    @Override
    public String toString() {
        return "Editor{" +
                "title='" + title + '\'' +
                ", content='" + content + '\'' +
                ", imgs='" + imgs + '\'' +
                '}';
    }
}

public class DraftsBox {
    private final Stack<ArticleMemento> STACK = new Stack<ArticleMemento>();

    public ArticleMemento getMemento(){
        ArticleMemento articleMemento = STACK.pop();
        return articleMemento;
    }

    public void addMemento(ArticleMemento articleMemento){
        STACK.push(articleMemento);
    }
}

public class Test {
    public static void main(String[] args) {
        DraftsBox draftsBox = new DraftsBox();
        Editor editor = new Editor("手写备忘录模式","分数啥地方玩儿发送到","asdf.png");

        ArticleMemento articleMemento = editor.saveToMemento();
        draftsBox.addMemento(articleMemento);
    }
}

优点

  1. 简化发起人实体类(Originator)职责,隔离状态存储与获取,实现了信息的封装,客户端无需关系状态的保存细节。
  2. 提供状态回滚功能。

缺点

消耗资源:如果需要保存的状态过多是,每一次保存都回消耗很多内存。

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