设计模式-备忘录模式

备忘录模式

在一些有关卡的游戏中,总会有一些存档的操作,这就可以通过备忘录模式来对该状态进行存储;又或者说这是世界上买不到的药后悔药

主要解决:在不破坏封装的前提下,捕获对象的一个内部状态,并在对象外对这个状态进行保存,方便以后恢复到该状态。
所属类型:行为型模式
如何解决:通过一个备忘录类专门存储状态信息
关键代码:客户不与备忘录耦合,与备忘录管理类耦合
优点:1、提供了容易实现的恢复能力;2、保持关键对象的数据封装;3、将被存储的状态放在外面,不要和关键对象混在一起,还可以帮忙维护内聚
缺点:消耗资源,如果要进行存储的存档过多,那么就会耗费大量资源。这可能就是为什么有的游戏会对存档的数量进行限制的原因把。

这个就是备忘录模式中要存储的存档,这个存档中保存着备忘录中的数据。

public class Memento {
    private String state;

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

    public String getState() {
        return state;
    }
}

Originator这里相当于是作为存档和备忘录的一个中转站把,通过Originator对象能够很好地对备忘录中的状态信息进行存储,而无需每次都创建一个新的对象,只有在存档时才进行Memento对象的创建。

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) {
        state = memento.getState();
    }
}

这里是备忘录模式的核心,这里通过了一个ArrayList来实现了所谓的备忘录,通过这个ArrayList来对状态信息进行记录。

public class CareTaker {

    private ArrayList<Memento> mementos = new ArrayList<>();

    public void add(Memento state){
        mementos.add(state);
    }

    public Memento get(int index){
        return mementos.get(index);
    }

}

接下来对备忘录模式进行运行。originator用来记录对应的状态,careTaker负责对状态进行存档,这里对第一次的状态和第四次的状态进行存储,所以备忘录里面就存储了两条记录。

public class MementoDemo {
    public static void main(String[] args) {
        CareTaker careTaker = new CareTaker();
        Originator originator = new Originator();
        originator.setState("State #1");
        careTaker.add(originator.saveStateToMemento());
        originator.setState("State #2");
        originator.setState("State #3");
        originator.setState("State #4");
        careTaker.add(originator.saveStateToMemento());

        System.out.println(careTaker.get(0).getState());
        System.out.println(careTaker.get(1).getState());

        originator.getStateFromMemento(careTaker.get(0));
        System.out.println(originator.getState());
        originator.getStateFromMemento(careTaker.get(1));
        System.out.println(originator.getState());

    }
}

运行结果如下所示:

State #1
State #4
State #1
State #4

Tips

简单进行一次总结,备忘录模式能够帮助我们对数据进行存储,方便进行数据的恢复等相关操作,真正实现了有后悔药可吃。但是在进行存储存档时需要注意内存的消耗问题,要尽量减少对资源的耗费问题。

posted @   忠肝义胆-多隆  阅读(13)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示