备忘录模式

目录

1.核心思想

个人理解

2.成员

3.优点

4.代码实现

4.1 备忘录

4.2 发起人

4.3 看护者

4.4 测试类


1.核心思想

不用知道对象内部,实现对象的保存和删除后的恢复

个人理解

结合栈或者队列,去达到获取某一个特定位置的元素,换成备忘录模式,就是获取某一个阶段的对象状态

2.成员

Originator(发起人):负责创建一个备忘录对象,用于保存当前的内部状态。它也可以使用备忘录对象来恢复之前的状态。

Memento(备忘录):用于存储发起人的内部状态。备忘录对象不暴露任何关于发起人状态的具体实现细节。

Caretaker(看护者):负责保存备忘录对象。看护者无法对备忘录的内容进行修改,只能存取备忘录对象。

3.优点

封装内部状态:

备忘录模式通过备忘录对象封装了对象的内部状态,保护了对象的内部结构和实现细节。这样,外部代码无需了解对象的内部状态即可保存和恢复对象的状态。

支持状态恢复:

该模式允许对象在特定时间点保存其状态,并能够在需要时恢复到这些保存的状态。这对于实现“撤销”和“恢复”功能非常有用,例如文本编辑器中的撤销操作,或者游戏中的存档和恢复功能。

分离状态管理:

备忘录模式将状态的保存和恢复从对象的业务逻辑中分离出来,使得对象可以专注于自身的核心功能,而看护者类负责管理状态的保存和恢复。这种分离提高了代码的可维护性和可读性。

历史记录管理:

看护者类可以保存多个备忘录对象,从而管理对象的历史状态。这样可以实现对对象状态的历史回溯,支持复杂的撤销和重做操作。

4.代码实现

4.1 备忘录

//备忘录类
public class Memento {
    private final String state;

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

    public String getState() {
        return state;
    }
}

4.2 发起人

//发起人
public class Originator {
    private String state;

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

    public String getState() {
        return state;
    }

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

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

4.3 看护者

//看护者
public class Caretaker {
    private final Stack<Memento> mementoStack = new Stack<>();

    public void saveMemento(Memento memento) {
        mementoStack.push(memento);
    }

    public Memento getLastMemento() {
        return mementoStack.pop();
    }
}

4.4 测试类

public class Test {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        // 设置初始状态并保存
        originator.setState("状态 #1");
        caretaker.saveMemento(originator.saveStateToMemento());

        // 修改状态并保存
        originator.setState("状态 #2");
        caretaker.saveMemento(originator.saveStateToMemento());

        // 再次修改状态
        originator.setState("状态 #3");
        System.out.println("当前状态: " + originator.getState()); // 打印当前状态

        // 从备忘录中恢复到上一个状态
        originator.getStateFromMemento(caretaker.getLastMemento());
        System.out.println("恢复到: " + originator.getState()); // 打印恢复后的状态

        // 从备忘录中恢复到之前的状态
        originator.getStateFromMemento(caretaker.getLastMemento());
        System.out.println("恢复到: " + originator.getState()); // 打印恢复后的状态
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值