码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-06-25 21:39:24      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

备忘录模式(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)管理,发起人无需管理状态的备份。而在还原状态时,又由发起人自己执行状态还原方法,外界无法获取发起人的备份状态信息从而保证了备份数据的安全性。
  备忘录模式的缺点
    将对象状态备份会占用较多的系统资源。

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

标签:

原文地址:http://www.cnblogs.com/a294098789/p/5616875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!