Gof设计模式之备忘录模式 (Memento)

备忘录模式定义:备忘录是一个对象,它保存另外一个对象在某一时刻的状态。

备忘录模式功能:在不破坏对象的封装性的前提下,保存对象的某一时刻的内部状态。
不破坏封装性,即不暴露对象没必要要的细节。

备忘录模式中涉及的名词与解释。
一、备忘录
备忘录,它是一个封装数据的对象,它保存某一对象的某个时刻的状态,它不一样于普通的封装数据的对象,它不该包含多于的细节(方法)。
为了实现对象的封装性,一般备忘录的实现代码放到原发器类中,做为原发器类的内部私有类,只经过原发器对其操做;
二、原发器
原发器,它是咱们要用备忘录去保存状态的对象。经过它来操做备忘录,建立和恢复它的某一时刻的备忘录。
三、备忘录管理器
用于缓存备忘录,而且能够缓存多个。

备忘录模式的优缺点
一、优势:
  (1)更好的封装性
     经过备忘录对象保存原发器对象的内部状态,虽然备忘录对象保存在管理器中(外部),但因为经过窄接口的方式实现的备忘录,导致外部对象没法操做原发器对象的内部数据。
  (2)简化了原发器
     备忘录对象被保存在原发器对象外,由客户来管理他们请求的状态,从而简化了原发器对象。
  (3)窄接口与宽接口
     窄接口与宽接口实现了原发器对象在不一样的地方有不一样的访问方式。原发器外部经过窄接口访问备忘录,保护原发器对象的状态。
     在原发器内部,能够经过宽接口设置备忘录,保存某一时刻的备忘录。
二、缺点
  能够会致使高开销。
  备忘录的基本功能,就是建立、恢复备忘录中的状态,备忘录的基本实现方式就是缓存备忘录对象。
  若是高频率的建立备忘录,或是备忘录中缓存的数据量较大,都会致使高开销。

示例:
示例说明:一个对象初始化后,通过初步处理获得某一状态,用备忘录保存此状态。再用不一样的处理,处理此状态。
代码:
一、备忘录的窄接口
public class Memeto{
}

二、备忘录的原发器(备忘录为某一对象保存某一状态,这个对象就是原发器)。
package gof.memeto;

/**
 * @author andy
 * 备忘录的原发器
 */
public class Originator {
 // 原发器名称
 private String name;
 // 原发器某一状态时的值
 private String state;
 // 原发器某一状态时的值
 private String result;

 public Originator(String n) {
 this.name = n;
 }

 /**
  * 初始化原发器,获得要保存的状态
  */
 public void runInit() {
 this.state = "state0";
 this.result = "result0";
 }

 /**
  * 方案1改变保存的状态
  */
 public void runSchema1() {
 this.state += "----state1";
 this.result += "----result1";
 System.out.println("state:" + this.state);
 System.out.println("result:" + this.result);
 }

 /**
  * 方案2改变保存的状态
  */
 public void runSchema2() {
 this.state += "----state2";
 this.result += "----result2";
 System.out.println("state:" + this.state);
 System.out.println("result:" + this.result);
 }

 public Memeto createMemeto() {
 return new MemetoImpl(this.state, this.result);
 }

 public void setMemeto(Memeto m) {
 MemetoImpl mi = (MemetoImpl) m;
 this.state = mi.state;
 this.result = mi.result;
 }

 private static class MemetoImpl implements Memeto {
 // 保存原发器某一状态时的值
 private String state;
 // 保存原发器某一状态时的值
 private String result;

 public MemetoImpl(String s, String r) {
 this.state = s;
 this.result = r;
 }

 /**
  * @return the state
  */
 public String getState() {
 return state;
 }

 /**
  * @return the result
  */
 public String getResult() {
 return result;
 }

 }
}

三、备忘录的管理者
package gof.memeto;

/**
 * @author andy
 * 备忘录的管理者
 */
public class MemetoCareTaker {
 private Memeto memeto = null;

 public void savaMemeto(Memeto memeto) {
 this.memeto = memeto;
 }

 public Memeto retriveMemeto() {
 return memeto;
 }

}

四、测试Main方法
package gof.memeto;

public class Main {

 /**
  * @param args
  */
 public static void main(String[] args) {
 // 原发器
 Originator ori = new Originator("memeto test");
 // 初始化原发器
 ori.runInit();
 
 // 备忘录的管理者
 MemetoCareTaker mct = new MemetoCareTaker();
 mct.savaMemeto(ori.createMemeto());
 
 // 运行方案1
 ori.runSchema1();
 
 // 不用备忘录恢复状态,运行方案2
 ori.runSchema2();
 
 // 用备忘录恢复状态,运行方案2
 ori.setMemeto(mct.retriveMemeto());
 ori.runSchema2();
 }

}
相关文章
相关标签/搜索