行为型模式之备忘录模式

备忘录模式介绍

见名知义,备忘录模式是用来保存对象的当前状态,并且在之后可以再次恢复到此状态,备忘录模式实现的方式需要保证对象的状态不能被对象从外部访问,目的是为了更好的保存这些对象的完整性以及实现内部不向外暴露。

备忘录模式的定义

在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。

备忘录模式的使用场景

(1)需要保存一个对象在某一时刻的状态或部分备忘录模式的类图

备忘录模式的类图

类图
角色介绍

  • Originator - 需要用备忘录模式保存自身内部状态的对象,负责创建一个备忘录(Memoto),可以记录、恢复自身的内部状态
  • Memoto - 备忘录角色,用于存储originator的内部状态,并且可以防止Originator以外的对象访问Memoto
  • Caretaker - 负责存储备忘录,不能对备忘录的内容进行操作和访问,只能把备忘录传递给其他对象

备忘录模式的简单示例

对备忘录模式来说,比较形象的是记事本中的存档功能,点击存档后,就算每次我们在记事本上写下一段话后,不小心退出了,再次进来时,还会接着上次的文本继续来写,下面用代码来实现。
首先记事本软件,即Originator角色

public class NotePad {

    private String mText = "";

    //在记事本上写文本
    public void note(String text){
        mText += text;
        System.out.println("写笔记:" + mText);
    }

    //退出记事本
    public void quit(){
        System.out.println("当前文本:" + mText);
        System.out.println("退出记事本!");
    }

    //创建备忘录
    public Memoto createMemoto(){
        Memoto memoto = new Memoto();
        memoto.text = mText;
        return memoto;
    }

    //恢复存档
    public void restore(Memoto memoto){
       mText = memoto.text;
       System.out.println("恢复后的记事本文本:" + mText);
    }

}

在记事本中,我们中设置了一个字段,用来存储文本,当调用note方法时记笔记,在笔记本中通过createMemoto方法创建备忘录对象,将自身状态保存到一个Memoto对象中,外部可以通过restore方法将记事本的状态从备忘录对象恢复。
下面来看备忘录对象,存储文本字段,即Memoto角色

public class Memoto {
    public String text;

    @Override
    public String toString() {
        return "Memoto: 存储的文本text = " + text;
    }
}

Memoto中只是用来保存Originator一些字段,防止外部直接访问Originator,而备忘录的直接操作者是Caretaker角色
负责管理Memoto,即Caretaker角色

public class Caretaker {
    private Memoto mMemoto;//备忘录

    //存档
    public void storeMemoto(Memoto memoto){
        mMemoto = memoto;
    }

    //获取存档
    public Memoto restoreMemoto(){
        return mMemoto;
    }
}

Caretaker负责管理Memoto对象,我们再来看客户端代码
客户端

public class Client {

    public static void main(String[] args){
        //构建记事本
        NotePad notePad = new NotePad();
        //构建Caretaker
        Caretaker caretaker = new Caretaker();
        //记笔记
        notePad.note("今天发现了");
        //存档
        caretaker.storeMemoto(notePad.createMemoto());
        //退出记事本
        notePad.quit();
        //再次进入笔记本
        NotePad notePad2 = new NotePad();
        //恢复存档
        notePad2.restore(caretaker.restoreMemoto());
        //接着写
        notePad2.note("很好玩的事情");
    }
}

输出结果

写笔记:今天发现了
退出记事本!当前文本:今天发现了
恢复后的记事本文本:今天发现了
写笔记:今天发现了很好玩的事情

在客户端中先构建了一个记事本,然后写东西,通过Caretaker存档,退出,再次构建笔记本,通过Caretaker恢复数据,就接上了上次的文本。在这之中,并没有直接存储NotePad对象,而是通过Memoto对象对NotePad对象数据进行存储,把对Memoto的存取操作交给Caretaker对象。整个过程中,各个对象分工明确。

总结

备忘录模式是在不破坏对象封装的条件下,通过备忘录对象存储另外一个对象内部状态,在合适的时候把这个对象还原。
优点:
(1)给用户提供一种可以恢复状态的机制
(2)实现信息的封装,使得用户不需要关心状态的保存细节
缺点:
(1)消耗资源,如果类成员过多,每保存一次都会消耗一定的资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值