• 设计模式(18)-----备忘录模式


    备忘录模式(memento)

    定义

      在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象回复到原先保存的状态。

    UML图

      

    角色说明

      备忘录(Memento)角色

        (1)将发起人(Originator)对象的内战状态存储起来。备忘录可以根据发起人对象的判断来决定存储多少发起人(Originator)对象的内部状态。

        (2)备忘录可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。

      发起人(Originator)角色

        (1)创建一个含有当前的内部状态的备忘录对象。

        (2)使用备忘录对象存储其内部状态。

      负责人(Caretaker)角色

        (1)负责保存备忘录对象。

        (2)不检查备忘录对象的内容。

    例子

      发起人角色

    package com.csdhsm.pattemdesign.memento;
    
    /**  
     * @Title:  Originator.java   
     * @Description: 发起人类
     * @author: Han   
     * @date:   2016年6月25日 下午8:26:03  
     */  
    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 setMemento(Memento memento) {
            
            state = memento.getState();
        }
        
        public void show() {
            
            System.out.println("State  " + state);
        }
    }

      备忘录类

    package com.csdhsm.pattemdesign.memento;
    
    /**  
     * @Title:  Memento.java   
     * @Description: 备忘录类
     * @author: Han   
     * @date:   2016年6月25日 下午8:26:26  
     */  
    public class Memento {
        
        private String state;
    
        public Memento(String state) {
            this.state = state;
        }
    
        public String getState() {
            return state;
        }
    }

      管理者类

    package com.csdhsm.pattemdesign.memento;
    
    /**  
     * @Title:  Caretaker.java   
     * @Description: 管理者类
     * @author: Han   
     * @date:   2016年6月25日 下午8:27:30  
     */  
    public class Caretaker {
        
        private Memento memento;
    
        public Memento getMemento() {
            return memento;
        }
        
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
    }

      客户端

    package com.csdhsm.pattemdesign.memento;
    
    public class Solution {
        
        public static void main(String[] args) {
            
            Originator o = new Originator();
            //Originator初始状态,状态属性为"On"
            o.setState("On");
            o.show();
            
            Caretaker c = new Caretaker();
            //将状态备份
            c.setMemento(o.createMemento());
            
            //状态更换为Off
            o.setState("Off");
            o.show();
            
            o.setMemento(c.getMemento());
            o.show();
        }
    }

      结果

     

      OK,成功!

    总结

      备忘录模式的优点
        (1)将对象状态备份,便于在出现意外时进行状态回滚。
        (2)对象状态的副本交由管理器(Caretaker)管理,发起人无需管理状态的备份。而在还原状态时,又由发起人自己执行状态还原方法,外界无法获取发起人的备份状态信息从而保证了备份数据的安全性。
      备忘录模式的缺点
        将对象状态备份会占用较多的系统资源。

  • 相关阅读:
    [POJ1151]Atlantis
    [POJ1177]Picture
    [POJ1765]November Rain
    Adaptively handling remote atomic execution based upon contention prediction
    Webpack 2.0 的文档
    PAT乙级 1025. 反转链表 (25)
    PAT乙级 1024. 科学计数法 (20)(未通过全部测试,得分18)
    PAT乙级 1023. 组个最小数 (20)
    PAT乙级 1022. D进制的A+B (20)
    PAT乙级 1021. 个位数统计 (15)
  • 原文地址:https://www.cnblogs.com/a294098789/p/5616875.html
Copyright © 2020-2023  润新知