美文网首页
行为型模式——备忘录模式

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

作者: Doooook | 来源:发表于2020-08-30 08:53 被阅读0次

    概念

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

    实现

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


    image.png
    • Originator(发起者):发起者是我们需要记住状态的对象,以便在某个时刻恢复它。
    • Caretaker(管理者):这是负责触发发起者的变化或触发发起者返回先前状态的动作的类。
    • Memento(备忘录):这是负责存储发起者内部状态的类。备忘录提供了两种设置和获取状态的方法,但这些方法应该对管理者隐藏。

    应用实例

    发起者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)存储另外一个对象内部状态的快照,在将来合适的时候把这个对象还原到存储起来的状态。

    优点

    • 给用户提供了一种可以恢复状态的机制,可以是用户能够方便的回到某个历史的状态
    • 实现了信息的封装,是的用户不需要关心状态的保存细节

    缺点

    • 消耗资源,如果累的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

    相关文章

      网友评论

          本文标题:行为型模式——备忘录模式

          本文链接:https://www.haomeiwen.com/subject/gkzjsktx.html