设计模式:Memento--备忘录模式

    xiaoxiao2022-07-13  154

    备忘录模式:

    主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。做个图来分析一下:

    Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。Memento类是备忘录类,Storage类是存储备忘录的类(备忘录管理者),持有Memento类的实例,该模式很好理解。

     

    实例代码一:

    public class Original { private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } public Original(String value) { this.value = value; } //备份 public Mementor createMementor() { return new Mementor(value); } //恢复备份的数据 public void restoreMemento(Mementor mementor) { this.value = mementor.getValue(); } } *********************************************************************************** public class Mementor { String value; public Mementor(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } *********************************************************************************** /** * 备份管理者 */ public class Storage { private Mementor mementor; public Storage(Mementor mementor) { this.mementor = mementor; } public Mementor getMementor() { return mementor; } public void setMementor(Mementor mementor) { this.mementor = mementor; } } *********************************************************************************** /** * 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。 * * Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。 * Memento类是备忘录类,Storage类是存储备忘录的类,持有Memento类的实例,该模式很好理解。 */ public class MainClass { public static void main(String[] args) { String value = "aaaaa"; Original original = new Original(value); System.out.println("准备开始备份,最初的值:value="+value); //备份数据到memetor中,存到storage中 Mementor mementor = original.createMementor(); Storage storage = new Storage(mementor); System.out.println("已经备份完毕"); value= "bbbbbb"; System.out.println("修改原始值,修改后为value="+value); System.out.println("开始恢复原始值"); original.restoreMemento(mementor); System.out.println("恢复完毕,value="+original.getValue()); // 新建原始类时,value被初始化为aaaaa,后经过修改,将value的值置为bbbbbb,最后进行恢复状态,结果成功恢复了。其实我觉得这个模式叫“备份-恢复”模式最形象。 } } *********************************************************************************** 测试结果 准备开始备份,最初的值:value=aaaaa 已经备份完毕 修改原始值,修改后为value=bbbbbb 开始恢复原始值 恢复完毕,value=aaaaa

     

     

    实例代码二:

    /** * 原始类 */ public class Person { private String name; private int age; private String sex; public Person() { } public Person(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}'; } //创建备份 public Mementor creteMementor() { return new Mementor(name,age,sex); } //还原 public void setMementor(Mementor mementor) { this.age = mementor.getAge(); this.name = mementor.getName(); this.sex = mementor.getSex(); } } ************************************************************************* /** * 备份者 */ public class Mementor { private String name; private int age; private String sex; public Mementor(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } public Mementor() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } } ************************************************************************* /** * 备份管理者 */ public class CareTaker { private Mementor mementor; public Mementor getMementor() { return mementor; } public void setMementor(Mementor mementor) { this.mementor = mementor; } } ************************************************************************* public class MainClass { public static void main(String[] args) { Person person = new Person("zhangsan",22,"男"); System.out.println("最初的:"+person); /** * 原始的方式备份 */ //保存内部状态 Person backup = new Person(); backup.setName(person.getName()); backup.setAge(person.getAge()); backup.setSex(person.getSex()); System.out.println("备份的:"+backup); //修改 person.setAge(20); System.out.println("修改之后的:"+person); //回滚还原 person.setAge(backup.getAge()); System.out.println("还原之后的: "+person); System.out.println("*******************************"); /** * 使用备忘录模式方式备份 * */ CareTaker careTaker = new CareTaker(); //备份 careTaker.setMementor(person.creteMementor()); System.out.println("最初的"+person); person.setName("ibf"); person.setAge(11); person.setSex("女"); System.out.println("修改后:"+person); //还原 person.setMementor(careTaker.getMementor()); System.out.println("还原后的:"+person); } } ************************************************************************* 测试结果 最初的:Person{name='zhangsan', age=22, sex='男'} 备份的:Person{name='zhangsan', age=22, sex='男'} 修改之后的:Person{name='zhangsan', age=20, sex='男'} 还原之后的: Person{name='zhangsan', age=22, sex='男'} ******************************* 最初的Person{name='zhangsan', age=22, sex='男'} 修改后:Person{name='ibf', age=11, sex='女'} 还原后的:Person{name='zhangsan', age=22, sex='男'} *************************************************************************

     

     

    最新回复(0)