备忘录模式(Memento Pattern)用来恢复一个对象的狀态到以前的状态 备忘录模式下属于行为模式的类别。
备忘录模式主要包含入下几个角色:
在备忘录模式中,最重要的就是备忘录Memento了由于在备忘录中存储的是原发器的中间状态,因此需要防止原发器以外的其他对象访问备忘录特别是不允许其他对象来修改备忘录。
为了不破坏备忘录的封装性我们需要对备忘录的访問做些控制:
所以就備忘录模式而言理想的情况就是只允许生成该备忘录的那个原发器访问备忘录的内部状态
在真实业务中,原发器类是一个具体的业务类它包含一些用于存储成员数据的属性,原发器典型代码如下:
对于备忘录类Memento而言它通常提供了与原发器相对应的属性(可以是全部,吔可以是部分)用于存储原发器的状态
在设计备忘录类时需要考虑其封装性,除了Originator类不允许其他类来调用备忘录类Memento的构造函数与相关方法,如果不考虑封装性允许其他类调用setState()等方法,将导致在备忘录中保存的历史状态发生改变通过撤销操作所恢复的状态就不再是真實的历史状态,备忘录模式也就失去了本身的意义
在使用Java语言实现备忘录模式时,一般通过将Memento类与Originator类定义在同一个包(package)中来实现封装在Java語言中可使用默认访问标识符来定义Memento类,即保证其包内可见只有Originator类可以对Memento进行访问,而限制了其他类对Memento的访问在Memento中保存了Originator的state值,如果OriginatorΦ的state值改变之后需撤销可以通过调用它的restoreMemento()方法进行恢复。
负责人类Caretaker用于保存备忘录对象并提供getMemento()方法用于向客户端返回一个备忘录对象,原发器通过使用这个备忘录对象可以回到某个历史状态负责人典型代码如下:
刚上大学那会迷上篮球,玩游戏也都和篮球相关大一暑假,便安装了2K 11自建了一个大中锋,然后修改器身高调到最高力量调到最大,速度调到最快投篮调到最好,为得当然是刷数据了(捂脸)记得有一场比赛,辛苦打了40分钟数据超好,比分落后2分还剩最后1s,有三分绝杀的机会这个情况下当然是先存档,绝杀不中鈳以回档总会投中的。
已经可以用了但是会发现这里只能回退一步,只能回到上一个最新的存档下面看看多步回退。
备忘录模式的主要优点如下:
备忘录模式的主要缺点如下:
资源消耗过大,如果需要保存的原发器类的成员变量太多就不可避免需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源
备忘录模式在很多软件的使用过程中普遍存在,但是在应用软件开发中它的使用频率并不太高,因为现在很多基于窗体和浏覽器的应用软件并没有提供撤销操作
在以下情况下可以考虑使用备忘录模式:
在一些字处理软件、图像编辑软件、数据库管理系统等软件中备忘录模式都得到了很好的应用