我的漫漫程序之旅

专注于JavaWeb开发
随笔 - 39, 文章 - 310, 评论 - 411, 引用 - 0
数据加载中……

设计模式之学习 Memento模式

一、Memento模式的目的:

memento是一个保存另外一个对象内部状态拷贝的对象.这样以后就可以将该对象恢复到原先保存的状态.

二、Memento模式的简单例子:

下面的例子来源于Jdon网站的《GoF设计模式系列》的《Memento模式》,虽然简单却形象地表明了Memento模式的应用

package com.pattern.memento2;

/**
 * 原始对象
 * 
 * 
@author zdw
 * 
 
*/

public class Originator
{
    
private int age;
    
private String name;

    
public Memento getMemento()
    
{
        
return new Memento(this);
    }

    
//取出Memento中先前保存的数据,恢复为初始状态
    public void setMemento(Memento m)
    
{
        
this.setAge(m.getAge());
        
this.setName(m.getName());
    }


    
public int getAge()
    
{
        
return age;
    }


    
public void setAge(int age)
    
{
        
this.age = age;
    }


    
public String getName()
    
{
        
return name;
    }


    
public void setName(String name)
    
{
        
this.name = name;
    }

}


package com.pattern.memento2;
/***
 * 备忘录对象
 * 
@author zdw
 *
 
*/

public class Memento
{
    
private int age;
    
private String name;

    
public Memento(Originator o)
    
{
        
this.age = o.getAge();
        
this.name = o.getName();
    }


    
public int getAge()
    
{
        
return age;
    }


    
public void setAge(int age)
    
{
        
this.age = age;
    }


    
public String getName()
    
{
        
return name;
    }


    
public void setName(String name)
    
{
        
this.name = name;
    }

}

测试类:
package com.pattern.memento2;

public class Client
{

    
public static void main(String[] args)
    
{
        Originator o 
= new Originator();
        o.setAge(
18);
        o.setName(
"马云");

        o.setMemento(
new Memento(o));

        Memento m 
= o.getMemento();

        o.setAge(
88);
        o.setName(
"God");
        
// o对象的先前值
        System.out.println(m.getAge() + "\n" + m.getName());
        
// o对象的新值
        System.out.println(o.getAge() + "\n" + o.getName());
    }


}


三、Memento模式的特点:

在需要提供保存、恢复对象状态的类中,必须提供两个方法:

.保存对象当前状态方法:将对象自身(this)作为参数传入,创建备忘录。
.恢复对象之前状态的方法:取出备忘录/接收一个备忘录对象,从中获取对象之前的状态

模式的缺点是耗费大,如果内部状态很多,再保存一份,无意要浪费大量内存.

注意:Memento模式保存的是操作前对象的状态,而不是操作后对象的状态;否则就没办法做恢复了



posted on 2008-06-11 15:48 々上善若水々 阅读(636) 评论(0)  编辑  收藏 所属分类: 设计模式


只有注册用户登录后才能发表评论。


网站导航: