小威要向诸佬学习呀

小威要向诸佬学习呀

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的备忘录模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
23种设计模式之备忘录模式(Memento Pattern)-LMLPHP

以下正文开始
23种设计模式之备忘录模式(Memento Pattern)-LMLPHP

备忘录模式概念

备忘录模式(Memento Pattern)是一种行为型设计模式。该模式允许在不暴露对象实现细节的情况下,将对象恢复到之前的状态。

备忘录模式角色

备忘录模式由三个核心角色组成:

发起人(Originator):发起人是具有要恢复状态的对象。它定义了创建备忘录对象的方法,以便在需要时使用这些备忘录来恢复对象的先前状态。

备忘录(Memento):备忘录对象是用于保存发起人对象状态的容器。它通常只存储发起人的状态信息,而不包括任何关于状态如何被捕获或恢复的实现细节。

管理者(Caretaker):管理者负责管理备忘录对象,并且只能对它们进行保存和恢复的操作。管理者可以对备忘录执行操作,但是不能查看或修改其内容。

在备忘录模式中,当发起人需要保存旧状态时,它会向管理者请求一个备忘录对象。管理者返回一个新的备忘录对象,并将当前状态保存在其中。如果在之后需要恢复状态时,发起人将这个备忘录对象还原为旧状态,这个备忘录对象将包含旧的状态信息。

备忘录模式优缺点

备忘录模式的优点是它可以让发起人对象有更好的封装性,因为它不需要暴露其实现细节;同时,备忘录对象的存储和恢复操作对发起人对象是透明的,从而减少了耦合。然而,使用备忘录模式可能会带来一些开销,尤其是在需要恢复大量状态信息时。

备忘录模式常见的应用场景包括文本编辑器的撤销操作、数据库事务回滚、游戏存档等等。

备忘录模式案例

接着通过一个案例来学习一下备忘录模式:

首先创建发起人类(Originator)

public class Originator {

    private String state;

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

    public String getState() {
        return state;
    }

    /**
     * 将当前状态存储到备忘录中
     */
    public Memento createMemento() {
        return new Memento(state);
    }

    /**
     * 从备忘录中恢复状态
     */
    public void restoreFromMemento(Memento memento) {
        state = memento.getState();
    }

}

接着创建备忘录类(Memento)

public class Memento {

    private final String state;

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

    public String getState() {
        return state;
    }

}

创建负责人类(Caretaker)

public class Caretaker {

    private Memento memento;

    /**
     * 存储备忘录
     */
    public void storeMemento(Memento memento) {
        this.memento = memento;
    }

    /**
     * 获取备忘录
     */
    public Memento retrieveMemento() {
        return memento;
    }

}

然后测试代码

public class MementoPatternDemo {

    public static void main(String[] args) {
        Originator originator = new Originator(); // 创建发起人对象
        Caretaker caretaker = new Caretaker(); // 创建负责人对象

        originator.setState("State1"); // 设置状态
        caretaker.storeMemento(originator.createMemento()); // 将备忘录存储到负责人中

        originator.setState("State2"); // 改变状态

        // 从备忘录恢复当前状态
        originator.restoreFromMemento(caretaker.retrieveMemento());

        System.out.println("Current state: " + originator.getState());
    }

}

在上述代码中,发起人类(Originator)负责创建和存储备忘录,备忘录类(Memento)用于存储当前状态,负责人类(Caretaker)则负责管理备忘录。在测试代码中,将发起人对象的状态从“State1”改变到“State2”,然后使用负责人对象的备忘录恢复机制将状态还原回原来的“State1”。

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
23种设计模式之备忘录模式(Memento Pattern)-LMLPHP

23种设计模式之备忘录模式(Memento Pattern)-LMLPHP

05-29 23:54