设计模式--第18篇(备忘录模式)

一,备忘录模式

备忘录模式: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以方便后面恢复到原先状态;

二,原理类图

在这里插入图片描述
意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
适用性:
必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。
如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

三,实例

Originator: 需要保存状态的对象

package com.neei.memento;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/16  22:40
 * @Description: 游学网
 * @throws:
 */
public class Originator {

    private String status;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Memento saveStatusMemento() {
        return new Memento(status);
    }

    public void getStatusFromMemento(Memento memento) {
        status = memento.getStatus();
    }
}

Memento(备忘录对象): 负责保存记录,即保存Originator内部状态的对象

package com.neei.memento;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/16  22:41
 * @Description: 游学网
 * @throws:
 */
public class Memento {
    private String status;

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

    public String getStatus() {
        return status;
    }
}

Caretaker(守护者对象): 负责保护多个备忘录对象,如备忘录集合等;

package com.neei.memento;

import java.util.ArrayList;
import java.util.List;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/16  22:44
 * @Description: 游学网
 * @throws:
 */
public class Caretaker {
    private List<Memento> mementos = new ArrayList<>();

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

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

调用

package com.neei.memento;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/16  22:36
 * @Description: 游学网
 * @throws:
 */
public class Client {
    public static void main(String[] args) {
        Caretaker caretaker = new Caretaker();
        Originator originator = new Originator();
        originator.setStatus("状态1");
        caretaker.add(originator.saveStatusMemento());
        originator.setStatus("状态2");
        caretaker.add(originator.saveStatusMemento());
        originator.setStatus("状态3");
        caretaker.add(originator.saveStatusMemento());
        System.out.println("当前状态为:" +originator.getStatus());
        originator.getStatusFromMemento(caretaker.get(0));
        System.out.println("恢复状态1,当前状态为:" +originator.getStatus());
    }
}

四,源码分析

spring-web-flow源码中使用的备忘录模式,如org.springframework.binding.message.StateManageableMessageContext

public interface StateManageableMessageContext extends MessageContext {

    /**
     * Create a serializable memento, or token representing a snapshot of the internal state of this message context.
     * @return the messages memento
     */
    public Serializable createMessagesMemento();

    /**
     * Set the state of this context from the memento provided. After this call, the messages in this context will match
     * what is encapsulated inside the memento. Any previous state will be overridden.
     * @param messagesMemento the messages memento
     */
    public void restoreMessages(Serializable messagesMemento);

    /**
     * Configure the message source used to resolve messages added to this context. May be set at any time to change how
     * coded messages are resolved.
     * @param messageSource the message source
     * @see MessageContext#addMessage(MessageResolver)
     */
    public void setMessageSource(MessageSource messageSource);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下捕获对象的内部状态,并在对象之外保存这个状态,以便在以后的某个时候将其恢复到原先的状态。 备忘录模式由三个主要角色组成: 1. 发起人(Originator):负责创建一个备忘录,并记录和恢复自身的内部状态。 2. 备忘录(Memento):负责存储发起人对象的内部状态。 3. 管理者(Caretaker):负责保存备忘录,并可以对其进行管理,但不知道备忘录的具体内容。 该模式的工作流程如下: 1. 发起人创建一个备忘录,将自己的状态保存在备忘录中。 2. 发起人可以根据需要在任何时候保存自己的状态。 3. 管理者将备忘录保存起来,可维护多个备忘录。 4. 在需要恢复状态的时候,可以通过管理者获取相应的备忘录,并将发起人的状态恢复到备忘录中保存的状态。 备忘录模式的优点是: - 发起人对象与备忘录对象分离,实现了信息的封装和隐藏。 - 备忘录对象存储了发起人对象的历史状态,可以实现撤销和恢复操作。 - 备忘录可以进行存储和管理,可进行序列化和持久化操作。 备忘录模式通常适用于以下情况: - 需要保存和恢复对象的状态,并且封装对象的状态对于其他对象来说是不可见的。 - 需要实现撤销和恢复功能。 - 需要保存和恢复部分或全部对象状态的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值