行为型模式——备忘录模式

2020-08-30  本文已影响0人  Doooook

概念

备忘录模式用于保存对象的内部状态而不破坏其封装,并在以后阶段恢复其状态。比如涉及到事务操作,需要回滚时就需要保存之前的状态。

实现

备忘录模式依赖于三个类——Originator、Memento和Caretaker


image.png

应用实例

发起者CarOriginator

CarOriginator包含一个内部类CarMemento(备忘录),用于保存状态(saveState方法),恢复(restoreState)时使用

/**
 * @author: Jay Mitter
 * @date: 2020-08-29 22:03
 * @description: 发起者,通过创建一个新的备忘录对象来保存自己的内部状态
 */
@Data
public class CarOriginator {

    private String state;

    /**
     * 创建一个新的备忘录对象,保存发起者的状态
     * @return Memento
     */
    public CarMemento saveState() {
        return new CarMemento(this.state);
    }

    /**
     * 恢复状态
     * @param carMemento
     */
    public void restoreState(CarMemento carMemento) {
        this.state = carMemento.getState();
    }

    /**
     * CarMemento class
     */
    public static class CarMemento {

        private final String state;

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

        private String getState() {
            return state;
        }

    }

}

测试,备忘录管理者CarCaretaker

/**
 * @author: Jay Mitter
 * @date: 2020-08-29 22:05
 * @description: 备忘录管理者,负责保存备忘录对象,但是从不修改(甚至不查看)备忘录对象的内容
 */
public class CarCaretaker {

    public static void main(String[] args) {
        new CarCaretaker().runMechanicTest();
    }

    private void runMechanicTest() {
        CarOriginator.CarMemento carMemento = new CarOriginator.CarMemento("");
        CarOriginator originator = new CarOriginator();
        originator.setState("State1");
        originator.setState("State2");
        carMemento = originator.saveState();
        originator.setState("State3");
        originator.restoreState(carMemento);
        System.out.println("final state: " + originator.getState());
    }

}

结果:

final state: State2

总结

备忘录模式实在不破坏封装的条件下,通过备忘录对象(Memento)存储另外一个对象内部状态的快照,在将来合适的时候把这个对象还原到存储起来的状态。

优点

缺点

上一篇下一篇

猜你喜欢

热点阅读