依据对象的外部状态变动生成相应快照,以便当前复原。

上面举一个应用笔记软件的历史版本控制的例子来实现备忘录模式。

原始类

public class Note {    private String title;    private String content;    private Long createTime;    private Long updateTime;    private Integer version;    public Note(String title) {        this.title = title;        this.createTime = System.currentTimeMillis();        this.version = 0;    }    /**     * 更新笔记*      @param title*      @param content*     /    public void update(String title,String content){        NoteMemento memento = new NoteMemento(this.title,this.content,this.version);        NoteStack.push(memento);        if (title != null)this.title = title;        if (content != null)this.content = content;        this.updateTime = System.currentTimeMillis();        this.version++;    }    /***      返回最近更改记录*      @return*     /    public List<NoteMemento> history(){        return NoteStack.history();    }    /***      复原上一个版本的信息*     /    public void restore(){        NoteMemento memento = NoteStack.lastVersion();        this.title = memento.getTitle();        this.content = memento.getContent();        this.updateTime = System.currentTimeMillis();        this.version++;    }    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 Long getCreateTime() {        return createTime;    }    public void setCreateTime(Long createTime) {        this.createTime = createTime;    }    public Long getUpdateTime() {        return updateTime;    }    public void setUpdateTime(Long updateTime) {        this.updateTime = updateTime;    }    public Integer getVersion() {        return version;    }    public void setVersion(Integer version) {        this.version = version;    }    @Override    public String toString() {        return "Note{" +                "title='" + title + '\'' +                ", content='" + content + '\'' +                ", createTime=" + createTime +                ", updateTime=" + updateTime +                ", version=" + version +                '}';    }}

备忘录类(旧版本类)

public class NoteMemento {    private String title;    private String content;    private Integer version;    public NoteMemento(String title, String content, Integer version) {        this.title = title;        this.content = content;        this.version = version;    }    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 Integer getVersion() {        return version;    }    public void setVersion(Integer version) {        this.version = version;    }    @Override    public String toString() {        return "NoteMemento{" +                "title='" + title + '\'' +                ", content='" + content + '\'' +                ", version=" + version +                '}';    }}

版本存储类

public class NoteStack {    private static Stack<NoteMemento> noteMementos = new Stack<>();    public static void push(NoteMemento memento){        noteMementos.push(memento);    }    /***      返回最近的5条历史记录*      @return*     /    public static List<NoteMemento> history(){        return noteMementos.subList(noteMementos.size()>5?noteMementos.size()-5:0,noteMementos.size());    }    /***      返回上一个版本*      @return*     /    public static NoteMemento lastVersion(){        return noteMementos.lastElement();    }}

测试类

public class MemorandumTest {    @Test    public void test(){        Note note = new Note("母猪护理从入门到精通");        System.out.println(note);        note.update(null,"好一大头母猪,真难护理!!!!");        note.update("母猪养护从入门到精通",null);        System.out.println(note);        System.out.println(note.history());        note.update(null,"还要护理吗它真的好大!");        note.update(null,"不护理了,我去找头公猪护理!");        note.update(null,"啊!公猪也好大!");        note.update(null,"我还是持续护理母猪吧!");        System.out.println(note);        System.out.println(note.history());        note.restore();        System.out.println(note);    }}=====测试后果=====Note{title='母猪护理从入门到精通', content='null', createTime=1655912034992, updateTime=null, version=0}Note{title='母猪养护从入门到精通', content='好一大头母猪,真难护理!!!!', createTime=1655912034992, updateTime=1655912034994, version=2}[NoteMemento{title='母猪护理从入门到精通', content='null', version=0}, NoteMemento{title='母猪护理从入门到精通', content='好一大头母猪,真难护理!!!!', version=1}]Note{title='母猪养护从入门到精通', content='我还是持续护理母猪吧!', createTime=1655912034992, updateTime=1655912034996, version=6}[NoteMemento{title='母猪护理从入门到精通', content='好一大头母猪,真难护理!!!!', version=1}, NoteMemento{title='母猪养护从入门到精通', content='好一大头母猪,真难护理!!!!', version=2}, NoteMemento{title='母猪养护从入门到精通', content='还要护理吗它真的好大!', version=3}, NoteMemento{title='母猪养护从入门到精通', content='不护理了,我去找头公猪护理!', version=4}, NoteMemento{title='母猪养护从入门到精通', content='啊!公猪也好大!', version=5}]Note{title='母猪养护从入门到精通', content='啊!公猪也好大!', createTime=1655912034992, updateTime=1655912034996, version=7}