首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >备忘录模式

备忘录模式

作者头像
晚上没宵夜
发布2022-01-07 14:23:49
发布2022-01-07 14:23:49
3590
举报

设计模式没有具体的落地代码,写着总感觉是抽象的概念而已

1. 备忘录模式(Memento Pattern)

在不违反封装的情况下保存、获取对象的内部状态,然后在需要的时候可以恢复之前的状态。应用在存档、回退操作(ctrl + z、浏览器回退)

备忘录模式的组成:

  • Originator:发起者
  • Memento:存储状态的对象
  • CareTaker:状态的管理器

2. 流程

流程的背景:模拟游戏内的存档,然后在需要的时候回退

2.1 Originator

代码语言:javascript
复制
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 setMemento(Memento memento) {
        this.state = memento.getState();
    }
}

2.2 Memento

用于保存状态,也就是存档

代码语言:javascript
复制
public class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

2.3 CareTaker

存档的管理器,内部有多个状态

代码语言:javascript
复制
public class CareTaker {
    Map<String, Memento> map = new HashMap<>();

    public void add(String name, Memento memento) {
        map.put(name, memento);
    }

    public Memento get(String name) {
        return map.get(name);
    }
}

2.4 测试

代码语言:javascript
复制
public class Test {
    public static void main(String[] args) {

        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();

        // 角色刚进新手村,等级为 1
        originator.setState("1");
        careTaker.add("2021-10-1", originator.createMemento());
        
        // 新手村毕业了,等级为 10
        originator.setState("10");
        careTaker.add("2021-11-1", originator.createMemento());
        
        // 游戏通关了,等级为 99
        originator.setState("99");
        careTaker.add("2021-12-1", originator.createMemento());

        // 通关时的等级,1
        System.out.println(originator.getState());

        // 回档1,回到新手村,10
        originator.setMemento(careTaker.get("2021-10-1"));
        System.out.println(originator.getState());

        // 回档2,回到新手村毕业,99
        originator.setMemento(careTaker.get("2021-11-1"));
        System.out.println(originator.getState());
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 备忘录模式(Memento Pattern)
  • 2. 流程
    • 2.1 Originator
    • 2.2 Memento
    • 2.3 CareTaker
    • 2.4 测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档