备忘录模式

前言

备忘录模式一般不怎么用,它也是一种行为型设计模式。

目录

一、定义

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

二、模式原理分析

备忘录模式包含两个关键角色

  • 原始对象(Originator):除了创建自身所需要的属性和业务逻辑外,还通过提供方法 create()restore(memento) 来保存和恢复对象副本

  • 备忘录(Memento):用于保存原始对象的所有属性状态,以便在未来进行撤销操作

下面举的是单状态备忘录模式,多状态就需要用到Map集合了。

//发起人角色
public class Originator{
    //内部状态
    private String state = "";
    public String getState(){
        return state;
    }
    public void setState(String state){
        this.state = state;
    }
    //创建一个备忘录
    public Memento createMemento(){
        return new Memento(this.state);
    }
    //恢复一个备忘录
    public void restoreMemento(Memento _memento){
        this.setState(_memento.getState());
    }
}
//备忘录角色
public class Memento{
    //发起人的内部状态
    private String state = "";
    //构造函数
    public Memento(String _state){
        this.state = _state;
    }
    public String getState(){
        return state;
    }
    public void setState(String state){
        this.state = state;
    }
}
//备忘录管理员角色
public class Caretaker{
    //备忘录对象
    private Memento memento;
    public Memento getMemento(){
        return memento;
    }
    public void setMemento(Memento memento){
        this.memento = memento;
    }
}
//场景类
public class Client{
    public static void main(String[] args){
        //定义出发起人
        Originator originator = new Originator();
        //定义出备忘录管理员
        Caretaker caretaker = new Caretaker();
        //创建一个备忘录
        caretaker.setMemento(originator.createMemento());
        //恢复一个备忘录
        originator.restoreMemento(caretaker.getMemento());
    }
}
复制代码

三、使用场景

  • 需要保存一个对象在某一个时刻的状态时刻

  • 提供一个可回滚的操作,比如Word中的CTRL + Z 组合键

  • 需要监控的副本场景中。例如要监控一个对象的属性,但是监控又不应该作为系统的主业务来调用,可以考虑备份一个副本,在子线程中分析处理

  • 数据库连接的事务管理就是用的备忘录模式

四、优点

  • 能够快速撤消对对象状态的更改

  • 能够提升代码的扩展性。 备忘录模式是通过增加外部对象来保存原始对象的状态,而不是在原始对象中新增状态记录,当不再需要保存对象状态时就能很方便地取消这个对象。同理,新增备忘录对象也非常容易

  • 能够帮助缓存记录历史对象状态。比如,在客服会话聊天中,对于某一些重要的对话(退换货、价保等),我们会记录这些对象数据,传统的做法是调用一次服务接口,一旦服务出现故障就很容易导致聊天回复速度变慢;而使用备忘录模式则能够记录这些重要的数据信息(用户提供的订单数据),而不需要反复查询接口,这样能提升回复客户的效率

五、缺点

  • 备忘录的生命周期,要主动去管理,释放它们

  • 备忘录的性能,备份太多,势必对性能造成影响

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享