设计模式之——备忘录模式

一、基本介绍

备忘录模式(行为型):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。

二、包含角色

1.发起人角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

2.备忘录角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

3.对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

三、案例及UML类图

案例说明:

           当我们进行word文档操作时,总习惯性的按ctrl+s进行保存操作,当写错时就回滚到上一步或者更上一步即可。

 

UML类图:

类Word:

public class Word {

    //word内容
    private StringBuilder content = new StringBuilder();

    /**
     * 保存当前步骤
     * @return 备忘录
     */
    public Memento saveContent() {
        return new Memento(content.toString());
    }

    /**
     * 回滚
     * @param memento 回滚的内容
     */
    public void rollBack(Memento memento) {
        this.content = new StringBuilder();
        this.content.append(memento.getContent()).append("\n");
    }

    public void write(String content) {
        this.content.append(content);
    }

    public String show() {
        return content.toString();
    }
}

说明:文档类,发起人角色,提供了对当前文档的保存功能和回滚功能和写入功能。

类Memento:

public class Memento {

    //文档内容
    private String content;

    public Memento(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

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

说明:备忘录类,备忘录角色,保存word文档某一个时刻的内容。

类MementoManage:

public class MementoManage {

    private LinkedList<Memento> mementoList = new LinkedList<>();

    /**
     * 添加一个备忘录即保存内容
     * @param memento 备忘录
     */
    public void addMemento(Memento memento) {
        mementoList.add(memento);
    }

    /**
     * 获取上一步保存的内容
     * @return 备忘录
     */
    public Memento previousStep() {
        return mementoList.removeLast();
    }
}

说明:备忘录管理类,管理者角色,对备忘录进行保存和获取,不能对备忘录进行修改。

类MementoTest:

public class MementoTest {

    public static void main(String[] args) {
        //备忘录管理
        MementoManage mementoManage = new MementoManage();
        //创建一个文档准备写内容
        Word word = new Word();
        word.write("hello word!");
        //保存内容
        Memento memento = word.saveContent();
        mementoManage.addMemento(memento);
        word.write("jaav");
        //继续写内容
        word.write("我要学java");
        //发现之前的java打错了,返回上一步
        //获取上一步保存的内容
        Memento previousStep = mementoManage.previousStep();
        //word进行回滚
        word.rollBack(previousStep);
        //输出回滚后的内容
        System.out.println(word.show());
    }
}

说明:测试及客户端。

 

四、适用场景

1.需要保存/恢复数据的相关状态场景

2.提供一个可回滚的操作。

发布了39 篇原创文章 · 获赞 61 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/m0_37914588/article/details/103947780