zoukankan      html  css  js  c++  java
  • 行为型设计模式

    基本介绍

    备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态

    模式结构

    Originator(发起者):记录当前的状态,负责创建和恢复备忘录

    Memento(备忘录):负责存储发起者的状态,在需要的时候提供发起人需要的状态

    Caretaker(管理者):管理备忘录

    代码演示

    (这里我们以单角色、单状态、单备份来演示,思想是相同的,无非是存储数据结构上的区别)

    备忘录角色,定义了存储状态的变量,可以根据实际需求定义对应的存储对象

    public class Memento {
        private String state;
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    }
    

    发起者角色,存储状态,并且可以创建备忘录和将状态恢复为备忘录的值

    public class Originator {
        private String state;
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        public Memento createMemento() {
            Memento memento = new Memento();
            memento.setState(state);
            return memento;
        }
    
        public void restoreMemento(Memento memento) {
            this.state = memento.getState();
        }
    }
    

    管理者角色,管理了备忘录

    public class Caretaker {
        private Memento memento;
    
        public Memento getMemento() {
            return memento;
        }
    
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
    }
    

    测试类

    public class Client {
        @Test
        public void test() {
            //设置初始状态
            Originator originator = new Originator();
            originator.setState("状态1");
            System.out.println("初始状态:" + originator.getState());
    
            //创建管理者
            Caretaker caretaker = new Caretaker();
            caretaker.setMemento(originator.createMemento());
    
            //更新状态
            originator.setState("状态2");
            System.out.println("跟新状态:" + originator.getState());
    
            //恢复状态
            originator.restoreMemento(caretaker.getMemento());
            System.out.println("恢复状态:" + originator.getState());
        }
    }
    

    运行结果

    初始状态:状态1
    跟新状态:状态2
    恢复状态:状态1
    

    模式分析

    优点:

    • 给用户提供了一种可以恢复状态的机制,使用户可以比较方便的回退到某个历史的状态
    • 实现了信息的封装,使用户不需要关心备忘录中状态的保存细节

    缺点:

    • 在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的,为了节约内存,可以配合原型模式使用

    应用场景:

    • 游戏的存档
    • CTRL + Z 撤销
    • 浏览器的后退
    • 数据库的事务管理
    • ... ...
  • 相关阅读:
    excel 上标和下标
    Excel之tab键
    Excel分数、小数、身份证的录入
    excel快速访问工具栏和自定义选项卡
    excel如何快速实现数据区域的框选
    excel 如何快速实现绝对引用
    INT函数和ROUND
    Excel Vlookup 列查找函数
    excel合并同类项去重求和功能
    VBA 一个很神奇的东西
  • 原文地址:https://www.cnblogs.com/songjilong/p/12846761.html
Copyright © 2011-2022 走看看