阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

备忘录

29次阅读
没有评论

共计 1168 个字符,预计需要花费 3 分钟才能阅读完成。

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

备忘录模式(Memento),主要用于捕获一个对象的内部状态,以便在将来的某个时候恢复此状态。

其实我们使用的几乎所有软件都用到了备忘录模式。最简单的备忘录模式就是保存到文件,打开文件。对于文本编辑器来说,保存就是把 TextEditor 类的字符串存储到文件,打开就是恢复 TextEditor 类的状态。对于图像编辑器来说,原理是一样的,只是保存和恢复的数据格式比较复杂而已。Java 的序列化也可以看作是备忘录模式。

在使用文本编辑器的时候,我们还经常使用 Undo、Redo 这些功能。这些其实也可以用备忘录模式实现,即不定期地把 TextEditor 类的字符串复制一份存起来,这样就可以 Undo 或 Redo。

标准的备忘录模式有这么几种角色:

  • Memento:存储的内部状态;
  • Originator:创建一个备忘录并设置其状态;
  • Caretaker:负责保存备忘录。

实际上我们在使用备忘录模式的时候,不必设计得这么复杂,只需要对类似 TextEditor 的类,增加 getState()setState()就可以了。

我们以一个文本编辑器 TextEditor 为例,它内部使用 StringBuilder 允许用户增删字符:

public class TextEditor {private StringBuilder buffer = new StringBuilder();

    public void add(char ch) {buffer.append(ch);
    }

    public void add(String s) {buffer.append(s);
    }

    public void delete() {if (buffer.length() > 0) {buffer.deleteCharAt(buffer.length() - 1);
        }
    }
}

为了支持这个 TextEditor 能保存和恢复状态,我们增加 getState()setState()两个方法:

public class TextEditor {
    ...

    // 获取状态:
    public String getState() {return buffer.toString();}

    // 恢复状态:
    public void setState(String state) {this.buffer.delete(0, this.buffer.length());
        this.buffer.append(state);
    }
}

对这个简单的文本编辑器,用一个 String 就可以表示其状态,对于复杂的对象模型,通常我们会使用 JSON、XML 等复杂格式。

练习

给 TextEditor 添加备忘录模式。

下载练习

小结

备忘录模式是为了保存对象的内部状态,并在将来恢复,大多数软件提供的保存、打开,以及编辑过程中的 Undo、Redo 都是备忘录模式的应用。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1168字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中