备忘录模式定义:
在不破坏内部封装性的前提下,某个对象的内部状态的拷贝,这样在以后就可以将对象恢复到以前的状态。
备忘录模式的优点:
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","医生说:你要是再来晚点,伤口就。。。。就。。。。就好了");
结果: