备忘录模式



备忘录模式


1. 介绍

备忘录模式(Memento Pattern)是一种行为型模式。将对象的状态保存在它的备忘录对象中,以后就可以使用备忘录对象来将对象恢复到之前的状态中

简单理解:现在有一个订单,将这个订单的信息保存到备忘录中,相当于将这个订单复制了一份。以后,我们就可以使用备忘录将这个订单的状态恢复到之前的状态。


优点

  1. 使得状态信息可以恢复。由于备忘录的存在,使得状态的恢复变得非常简单。
  2. 实现了信息的封装。我们只需要使用恢复状态的接口就可以实现状态的恢复,而无需关注实现的细节。

缺点

  1. 占用内存会增大。由于需要使用备忘录来复制状态信息,如果状态信息很多很大,这势必会增大占用的内存空间。
  2. 为了遵循迪米特法则,通常会增加一个管理备忘录的类。

2. 例子

有订单、备忘录、管理者这三个类,备忘录可以用来存储订单的状态信息,而管理者管理备忘录。


类图:
在这里插入图片描述

Order类

package mementoPattern;

/**
 * 订单
 * 
 * @author jxd
 * @since 2021-06-13
 */
public class Order {

    private String state;
    
    public Order(String state) {
        this.state = state;
    }

    public void SetState(String state) {
        this.state = state;
    }
    
    public String getState() {
        return state;
    }
    
    /**
     * 创建订单的备忘录
     * @return 订单的备忘录
     */
    public Memento createMemento() {
        return new Memento(state); 
    }

}

Memento类
备忘录,可以存储订单中的状态信息。

package mementoPattern;

/**
 * 备忘录
 * 
 * @author jxd
 * @since 2021-06-13
 */
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;
    }

}

Caretaker类
管理者,用来管理备忘录。

package mementoPattern;

/**
 * 看管者
 * 
 * @author jxd
 * @since 2021-06-13
 */
public class Caretaker {

    private Memento memento;

    public Caretaker(Memento memento) {
        this.memento = memento;
    }
    
    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
    
    /**
     * 从备忘录中恢复订单的状态
     * @param order 要恢复的订单
     * @return 状态恢复后的订单
     */
    Order coverOrderState(Order order) {
        order.SetState(memento.getState());
        return order;
    }

}

测试类:

package mementoPattern;

import org.junit.Test;

/**
 * 备忘录模式的测试类
 * 
 * @author jxd
 * @since 2021-06-13
 */
public class TestJ {

    @Test
    public void test1() {
        Order order = new Order("已支付");
        System.out.println("订单的初始状态是:" + order.getState());

        Memento memento = order.createMemento();
        Caretaker caretaker = new Caretaker(memento);

        order.SetState("未支付");
        System.out.println("订单现在的状态是:" + order.getState());

        order = caretaker.coverOrderState(order);
        System.out.println("从备忘录中恢复后的订单状态为:" + order.getState());

    }

}

运行结果:

订单的初始状态是:已支付
订单现在的状态是:未支付
从备忘录中恢复后的订单状态为:已支付

3. 总结

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值