Memento备望录模式定义:
memento是一个保存另外一个对象内部状态拷贝的对象.这样以后就可以将该对象恢复到原先保存的状态.
		Memento模式相对也比较好理解,我们看下列代码:
		
				
						
								public class Originator { 
     private int number; 
  private File file = null;   public Originator(){}   // 创建一个Memento   public Memento getMemento(){     return new Memento(this);   }   // 恢复到原始值   public void setMemento(Memento m){      number = m.number;      file = m.file;   } }    | 
						
				
		
		我们再看看Memento类:
		
				
						
								| 
										 private class Memento implements java.io.Serializable{ 
										  private int number; 
										  private File file = null; 
										  public Memento( Originator o){ 
										    number = o.number;     file = o.file; 
										  } 
										} 
										
												 
										 
								 | 
						
				
		
		可见 Memento中保存了Originator中的number和file的值. 通过调用Originator中number和file值改变的话,通过调用setMemento()方法可以恢复.
		Memento模式的缺点是耗费大,如果内部状态很多,再保存一份,无意要浪费大量内存.
		
				Memento模式在Jsp+Javabean中的应用
				
在Jsp应用中,我们通常有很多表单要求用户输入,比如用户注册,需要输入姓名和Email等, 如果一些表项用户没有填写或者填写错误,我们希望在用户按"提交Submit"后,通过Jsp程序检查,发现确实有未填写项目,则在该项目下红字显示警告或错误,同时,还要显示用户刚才已经输入的表项.
		如下图中 First Name是用户已经输入,Last Name没有输入,我们则提示红字警告.:
		
				
		
		这种技术的实现,就是利用了Javabean的scope="request"或scope="session"特性,也就是Memento模式.
------------------------------------
实例:
经常使用计算机的人恐怕对系统备份(Memento)不会陌生,当你的Windows系统运行正常时,对它进行备份,当系统运行有问题时,就可以调用备份快速的将系统恢复,这样就可以大量节省重新装系统的痛苦,特别是当你缺少某一驱动,或在装系统是出现一些怪问题时,犹为痛苦。我想有过这种经历的人应该很了解吧,呵呵!
好了,下面让我们看看这个过程该如何实现吧: 
 
1、我们先定义Windows系统(WindowsSystem)类:
 
public class WindowsSystem {
  private String state;
  public Memento createMemento() {  //创建备份,保存当前状态
    return new Memento(state);
  }
  public void restoreMemento(Memento memento){ //从备份中恢复系统
    this.state=memento.getState();
  }
  public String getState(){  //获得状态
    return this.state;
  }
  public void setState(String state){  //设置状态
    this.state=state;
    System.out.println("当前系统处于"+this.state);
  }
}
2、再定义备份(Memento)类:
public class Memento {
  private String state;
  public Memento(String state) {  //备份
    this.state=state;
  }
  public String getState(){ //获得状态
    return this.state;
  }
  public void setState(String state){  //设置状态
    this.state=state;
  }
}
3、定义用户(User)类:
public class User {
  private Memento memento;
  public Memento retrieveMemento() {  //恢复系统
    return this.memento;
  }
  public void saveMemento(Memento memento){  //保存系统
    this.memento=memento;
  }
}
4、编写测试类:
public class Test {
  public static void main(String args[]) {    
    WindowsSystem Winxp = new WindowsSystem(); //Winxp系统
    User user = new User();   //某一用户
    Winxp.setState("好的状态");   //Winxp处于好的运行状态
    user.saveMemento(Winxp.createMemento()); //用户对系统进行备份,Winxp系统要产生备份文件
    Winxp.setState("坏的状态");   //Winxp处于不好的运行状态
    Winxp.restoreMemento(user.retrieveMemento());   //用户发恢复命令,系统进行恢复
    System.out.println("当前系统处于"+Winxp.getState());
  }
}
5、说明:
A:定义:Memento对象是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态。
B:Memento模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
C:Memento模式所涉及的角色有三个,备忘录角色、发起人角色和负责人角色。
备忘录角色的作用:
(1)       将发起人对象的内部状态存储起来,备忘录可以根据发起人对象的判断来决定存储多少发起人对象的内部状态。
(2)       备忘录可以保护其内容不被发起人对象之外的任何对象所读取。
发起人角色的作用:
(1)       创建一个含有当前内部状态的备忘录对象。
(2)       使用备忘录对象存储其内部状态。
负责人角色的作用:
(1)       负责保存备忘录对象。
(2)       不检查备忘录对象的内容。
D:在本例中,备份(Memento)类是备忘录角色、Windows系统(WindowsSystem)类是发起人角色、用户(User)类是负责人角色。 
	posted on 2006-08-01 10:28 
保尔任 阅读(1185) 
评论(0)  编辑  收藏  所属分类: 
Design Patten