首页 - 新闻 -  Java 备忘录模式

Java 备忘录模式

2023-09-24 19:59

备忘录模式定义:

        在不破坏内部封装性的前提下,某个对象的内部状态的拷贝,这样在以后就可以将对象恢复到以前的状态。

 备忘录模式的优点:

         1.给用户提供了一种可以恢复状态的机制。

          2.实现了信息的封装,用户不需要关心内部的状态的保存细节。

   备忘录模式的缺点:

          1.如果类的成员变多,每个都需要保存一次,消耗内存。 

    备忘录模式的角色:

            1.原发器角色:创建一个备忘录对象,用备忘录存储它内部的状态。

             2.负责人角色:它含有备忘录角色,负责保护备忘录角色。

             3.备忘录角色:将原发器角色的内部状态存储起来,它需要保存哪些状态,由原发器决定。

  备忘录模式的使用场景:

             1.有需要保存/恢复数据的相关场景

              2.需要提供一个可回滚的操作。

下面以看到过的段子为例,写备忘录模式。

      

/***源发器角色* Created by  Administrator*/
public class Star {private String name;private String sex;private String say;public String getName() {return name;}public void setName(String name) {www.gsm-guard.net = name;}public String getSex() {return sex;}public void setSex(String sex) {www.gsm-guard.net = sex;}public String getSay() {return say;}public void setSay(String say) {this.say = say;}//创建一个备忘录public StarMemento memento(){return new StarMemento(Star.this);}//通过备忘录对象来恢复自己的状态public void recovery(StarMemento starMemento){www.gsm-guard.net=starMemento.getName();www.gsm-guard.net=starMemento.getSex();this.say=starMemento.getSay();}
}

 

/***备忘录角色* Created by  Administrator*/
public class StarMemento {private String name;private String sex;private String say;//保存原发器角色状态public StarMemento(Star star) {www.gsm-guard.net=star.getName();www.gsm-guard.net=star.getSex();this.say=star.getSay();}public String getName() {return name;}public void setName(String name) {www.gsm-guard.net = name;}public String getSex() {return sex;}public void setSex(String sex) {www.gsm-guard.net = sex;}public String getSay() {return say;}public void setSay(String say) {this.say = say;}
}
/***管理者角色* Created by  Administrator*/public class Controller {//持有备忘录角色的引用,封装了备忘录角色private  StarMemento starMemento;public StarMemento getStarMemento() {return starMemento;}public void setStarMemento(StarMemento starMemento) {this.starMemento = starMemento;}
}
//客户端调用
Controller controller=new Controller();
Star star=new Star();
//原发器的基本状态
star.setName("鹿晗");
star.setSex("男");
star.setSay("天啊,我的手指割破了,我要去医院");
//进行数据备份
controller.setStarMemento(star.memento());
Log.d("StarMemento","正常情况信息:"+star.getName()+"    "+star.getSex()+"    "+star.getSay());//在医院,医生看了看长相,然后记录信息
star.setSex("女");
Log.d("StarMemento","误操作情况信息:"+star.getName()+"    "+star.getSex()+"    "+star.getSay());//有人告诉医生,鹿晗是男的,医生进行数据恢复
star.recovery(controller.getStarMemento());
Log.d("StarMemento","正常情况信息:"+star.getName()+"    "+star.getSex()+"    "+star.getSay());//最后医生来了句:
Log.d("StarMemento","医生说:你要是再来晚点,伤口就。。。。就。。。。就好了");

结果: