zoukankan      html  css  js  c++  java
  • 设计模式-备忘录模式

    备忘录模式

    定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

    使用场景:需要保存、恢复数据的相关场景。提供可回滚的操作。如游戏中的存档、应用软件里的Ctrl+Z等。

    注意事项:为了符合迪米特法则,还需增加一个管理备忘录的类。为了节约内存还可使用原型模式+备忘录模式。

    结构:

    • 发起人(Originator):记录当前时刻的状态,提供创建和恢复备忘录的功能,实现其他业务功能。
    • 管理者(Caretaker):对备忘录进行管理,提供保存和获取备忘录的功能,但是不能对备忘录的内容进行修改
    • 备忘录(Memento):存储内部状态

    代码示例:

    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;
        }
    }
    
    public class Caretaker {
    
        private Memento memento;
    
        public Memento getMemento() {
            return memento;
        }
    
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
    }
    
    public class Originator {
    
        private String state;
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        public Memento createMemento(){
            return new Memento(state);
        }
    
        public void restoreMemento(Memento m){
            this.setState(m.getState());
        }
    }
    

    测试代码:

     public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
            Originator originator=new Originator();
            originator.setState("关卡1");
            System.out.println("继续玩游戏");
            originator.setState("关卡2");
    
            Caretaker caretaker=new Caretaker();
            Memento memento = originator.createMemento();
            //存档
            caretaker.setMemento(memento);
    
            originator.setState("关卡3");
            System.out.println("突然断电了,重新开机");
            Memento memento1 = caretaker.getMemento();
            //恢复
            originator.restoreMemento(memento1);
    
            System.out.println("恢复后的状态"+originator.getState());
        }
    

    返回目录

    书山有路勤为径,学海无涯苦作舟
  • 相关阅读:
    scrapy高级操作
    scrapy多url爬取
    scrapy基础使用
    selenuim
    数据解析
    python字典转为对象,用"."方式访问对象属性
    python AES.MODE_ECB(128位) pkcs5padding 加密算法
    maven
    maven在idea中的配置
    idea使用技巧
  • 原文地址:https://www.cnblogs.com/javammc/p/14961135.html
Copyright © 2011-2022 走看看