设计模式---备忘录模式

这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。

备忘录模式

1.什么是备忘录模式

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

白话文:简单理解就是备份一个状态用于后期恢复,比如我们编辑文件中的撤销和前进功能,象棋游戏中的悔棋。

2.应用场景

1、打游戏时的存档。

2、Windows 里的 ctri + z。

3、IE 中的后退。

4、数据库的事务管理。

5、在spring-webflow流中也有用到备忘录模式,由于webflow很少用到 ,故在此不做过多讲解,感兴趣的可以看看

引入maven依赖

<dependency> <groupId>org.springframework.webflow</groupId> <artifactId>spring-webflow</artifactId> <version>2.4.5.RELEASE</version> </dependency>

然后搜索StateManageableMessageContext类

3.主要角色

Originator 发起人,负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态;

Memento 备忘录,负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento;

Caretaker 管理者,负责保存好备忘录的Memento,不能对备忘录的内容进行操作或检查。

4.代码实现

1.发起人

记录当前时刻的内部状态,并负责创建和恢复备忘录数据,允许访问返回到先前状态所需的所有数据。

``` /** * 发起人 * * @author yzm */ @Data public class Originator {

private String state;

public Memento createMemento() {
    return new Memento(state);
}

public void restoreMemento(Memento m) {
    this.setState(m.getState());
}

} ```

2.备忘录

负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。

``` /** * 备忘录 * * @author yzm */ @Data @AllArgsConstructor public class Memento {

private String state;

} ```

3.备忘录管理者

对备忘录进行管理、保存和提供备忘录,只能将备忘录传递给其他角色。

``` /** * 管理者 * * @author yzm */ @Data public class Caretaker {

private Memento memento;

} ```

4.Client客户端

测试一下,即先将状态置为On,保存后再将状态置为Off,然后通过备忘录管理员角色恢复初始状态。

``` /** * 备忘录客户端 * * @author yzm */ public class MementoClient {

public static void main(String[] args) {
    //发起人
    Originator or = new Originator();
    //管理者
    Caretaker cr = new Caretaker();
    or.setState("S0");
    System.out.println("初始状态:" + or.getState());
    //保存状态
    cr.setMemento(or.createMemento());
    or.setState("S1");
    System.out.println("新的状态:" + or.getState());
    //恢复状态
    or.restoreMemento(cr.getMemento());
    System.out.println("恢复状态:" + or.getState());
}

} ```

5.运行结果

初始状态:S0 新的状态:S1 恢复状态:S0

5.优缺点

优点

  • 给用户提供了一种可以恢复状态的机制,可以使用能够比较方便地回到某个历史的状态
  • 实现了信息的封装,使得用户不需要关心状态的保存细节

缺点

  • 消耗资源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值