定义:在不破坏对象封装的前提下,捕获一个的对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
优点:1.可以使用能够比较方便地回到某个历史的状态
2.实现了信息的封装,使得用户不需要关心状态的保存细节
缺点:1.消耗资源
使用场景:ctrl+z键、浏览器回退。
原理:通过一个备忘录类专门存储对象状态(简单来说 就是把原来数据封装成一个实体类Memento 然后将这个实体类放在另一实体Caretaker中 当需要时 在把原来的实体取出重新使用)
类图:
Originator是发起人,事件内部的处理
Caretaker是管理者,用于set以前的数据 就是把原来的Memento数据放入保存
Memento是备忘录,记录数据的BO
代码模板
Memento
1. public class Memento { 2. 3. private String state; 4. 5. public Memento(String state) { 6. this.state = state; 7. } 8. 9. public String getState() { 10. return state; 11. } 12. 13. }
Originator
1. public class Originator { 2. 3. private String state; 4. 5. public String getState() { 6. return state; 7. } 8. 9. public void setState(String state) { 10. this.state = state; 11. } 12. 13. public Memento createMento() { 14. return (new Memento(state)); 15. } 16. 17. public void setMemento(Memento memento) { 18. state = memento.getState(); 19. } 20. 21. public void show() { 22. System.out.println("state = " + state); 23. } 24. 25. }
Caretaker
1. public class Caretaker { 2. 3. private Memento memento; 4. 5. public Memento getMemento() { 6. return memento; 7. } 8. 9. public void setMemento(Memento memento) { 10. this.memento = memento; 11. } 12. 13. }
栗子
Memento 需要保存的数据BO
1. public class PersonState{ 2. 3. private String arms; //武器 4. private String clothes; //衣服 5. 6. public PersonState(String arms,String clothes) { 7. this.arms = arms; 8. this.clothes = clothes; 9. } 10. 11. //get set 方法 12. 13. 14. }
Originator发起人 具体处理也业务的类
1. public class Originator{ 2. 3. private String arms; //武器 4. private String clothes; //衣服 5. 6. //get set 方法 7. 8. //新建状态 9. public PersonState createPersonState() { 10. return (new PersonState(arms,clothes)); 11. } 12. 13. public void setPersonState(PersonState personState) { 14. arms= personState.getArms(); 15. clothes = personState.getClothes(); 16. 17. } 18. 19. public void show() { 20. System.out.println("武器 = " + arms,"衣服=" + clothes); 21. } 22. 23. }
Caretaker
1. public class Caretaker { 2. 3. private PersonState personState; 4. 5. public PersonState getPersonState() { 6. return personState; 7. } 8. 9. public void setPersonState(PersonState personState) { 10. this.personState = personState; 11. } 12. 13. }
调用
1. public class Client { 2. 3. public static void main(String[] args) { 4. //初始状态 5. Originator originator = new Originator(); 6. originator.setArms("木剑"); //武器 7. originator.setClothes("布甲"); //衣服 8. originator.show(); 9. 10. //保存上一个状态 11. Caretaker caretaker = new Caretaker(); 12. caretaker.setPersonState(originator.createPersonState()); 13. 14. //充钱了 15. originator.setArms("屠龙刀"); //武器 16. originator.setClothes("大金链子大金表"); //衣服 17. originator.show(); 18. 19. //被人爆了 20. originator.setPersonState(caretaker.getMemento()); 21. originator.show(); 22. } 23. 24. }