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());
        }
    

    返回目录

    书山有路勤为径,学海无涯苦作舟
  • 相关阅读:
    java 获取一些项目或系统属性
    js验证是否为空、数字、邮政编码、联系电话、传真、电子邮箱格式(公用js)
    转:RBAC用户角色权限设计
    转:HTTP Header 详解一
    Myeclipse 突然出现启动不了的解决办法
    位图排序java版
    排序算法 归并排序
    转:Java安全管理器(Security Manager)
    一种将0元素前置的实现方案
    排序算法 快速排序源码
  • 原文地址:https://www.cnblogs.com/javammc/p/14961135.html
Copyright © 2011-2022 走看看