设计模式(二十)——备忘录模式(Memento)

备忘录模式旨在在不破坏对象封装性的情况下,捕获并保存对象的内部状态,以便在需要时恢复。文章通过游戏存档的例子解释了如何实现这一模式,包括Originator(原发器)和CareTaker(管理者)角色,以及Memento(备忘录)类的使用。在示例中,Originator保存和恢复其状态,CareTaker管理多个Memento实例,提供存档和读档功能。
摘要由CSDN通过智能技术生成
设计模式(二十)——备忘录模式(Memento)

保存一个对象的某个状态,以便在适当的时候恢复对象

意图

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

应用实例

游戏存档,ctrl+z,数据库事务

优点
  1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。

  2. 实现了信息的封装,使得用户不需要关心状态的保存细节

缺点

消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

实现

实现游戏存档功能。

Memento类,存储在列表中的存档

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;
    }
}

类似游戏进程,保存游戏时将Originator转化成Memento类,不会对Originator进行任何修改

public class Originator {
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

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

    public void getStateFromMemento(Memento memento){
        this.state = memento.getState();
    }
}

存储进度列表,实现读取存档功能

public class CareTaker {
    private List<Memento> mementoList = new ArrayList<Memento>();

    public List<Memento> getMementoList() {
        return mementoList;
    }

    public void add(Memento memento){
        mementoList.add(memento);
    }

    public Memento get(int index){
        return mementoList.get(index);
    }
}
public class Main {
    public static void main(String[] args) {
        //相当于游戏进度
        Originator originator = new Originator();
        //进度的列表
        CareTaker careTaker = new CareTaker();
        originator.setState("状态一,游戏刚刚开始,等级3");
        System.out.println(originator.getState());

        //保存游戏
        careTaker.add(originator.saveStateToMemento());

        originator.setState("状态二,游戏运行到中期,等级20");
        System.out.println(originator.getState());
        //继续游戏,但是之前的状态二进度没有保存
        originator.setState("状态三,游戏运行到后期,等级50");
        System.out.println(originator.getState());

        //保存游戏
        careTaker.add(originator.saveStateToMemento());

        //读取进度
        originator.getStateFromMemento(careTaker.get(0));
        System.out.println("读取进度,当前的进度是:"+originator.getState());

        //保存的进度列表
        System.out.println("\n所有保存的进度");
        for (Memento memento : careTaker.getMementoList()) {
            System.out.println(memento.getState());
        }
    }

}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张宜强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值