设计模式-备忘录模式

备忘录模式用于各种需要备份的操作,比如编辑器的ctrl+z的功能,或者游戏数据的存档等场景;本文以编辑器为例子来简单说明下备忘录设计模式设计的几个部分;考虑到一个场景,现在使用编辑器写文章,我们需要保存文章的各种历史操作,以便可以及时的回滚回去;

1.组成

先看下备忘录模式的几个组成部分,引用别人的图

3333

1>Originator

叫做原发器,可以理解为操作的对象,比如上面的文章对象,有标题和内容,需要把他的内容备份起来;在这个对象里面有两个主要的方法restoreMemento 恢复上一次状态,createMemento根据当前的状态创建备忘录,他可以自己决定要备份哪些内容;

2>Memento

备忘录对象,提供设置和获取状态的方法,这里的属性要根据上面Originator备份的内容决定要存哪些信息;

3>Caretaker

负责人对象,负责持有备忘录的内容,保存管理备忘录对象;

2.例子

这里模拟文章编辑器的工作,文章包括标题和内容;针对每一次操作,我们要记录文章内容,以便在需要的时候进行恢复操作;

1>首先是文章对象

public class Doc {

    private String title;

    private String body;

    public String getTitle() {
        return title;
    }

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

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public History createHistory() {
        return new History(this.body);
    }

    public void restoreDoc(History history) {
        this.body = history.getBody();
    }
}

2>备忘录对象

这里就存储文章的内容部分

public class History {

    private String body;

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public History(String body) {
        this.body = body;
    }
}

3>编辑器

编辑器负责管理备忘录对象,这里持有一个doc的引用,对文章可以进行恢复,清空内容,备份的操作;

public class Editor {
    private Doc doc;

    private List<History> histories = new ArrayList<>();

    public Doc getDoc() {
        return doc;
    }

    public void setDoc(Doc doc) {
        this.doc = doc;
    }

    public List<History> getHistories() {
        return histories;
    }

    public void setHistories(List<History> histories) {
        this.histories = histories;
    }

    public void append(String content) {
        doc.setBody(doc.getBody() + content);
        histories.add(doc.createHistory());
    }

    public void restore() {
        histories.remove(histories.size() - 1);
        doc.restoreDoc(histories.get(histories.size() - 1));
    }

    public void delete() {
        doc.setBody("");
        histories.add(doc.createHistory());
    }
}

测试代码

public static void main(String[] args) {
        Doc doc = new Doc();
        doc.setTitle("文章名称");
        doc.setBody("第一页内容");
        Editor editor = new Editor();
        editor.setDoc(doc);
        editor.append("aaaaa");
        editor.append("bbbbb");
        editor.append("cccc");
        editor.append("ddddd");
        editor.delete();
        editor.restore();
        editor.restore();
        System.out.println(doc.getBody());
    }

备忘录模式优点是:给用户提供了一种可以恢复状态的机制。可以是用户能够比较方便地回到某个历史的状态;封装了内部的细节,用户可以不用关心什么时候保存这些细节的内容;缺点是备忘录模式会占用较多的内存,消耗资源;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值