• 行为型模式-备忘录模式


    备忘录模式保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

    意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

    主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

    何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

    如何解决:通过一个备忘录类专门存储对象状态。

    关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。

    应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctrl + z。 4、IE 中的后退。 5、数据库的事务管理。

    优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。

    缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

    使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。

    注意事项: 1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。

    1. @AllArgsConstructor
    2. @Data
    3. @NoArgsConstructor
    4. public class Originator {
    5. private String state;
    6. public Memento saveStateToMemento(){
    7. return new Memento(state);
    8. }
    9. public void getStateFromMemento(Memento Memento){
    10. state = Memento.getState();
    11. }
    12. }
    1. @AllArgsConstructor
    2. @Data
    3. public class Memento {
    4. private String state;
    5. }
    1. public class CareTaker {
    2. private final List mementoList = new ArrayList();
    3. public void add(Memento state){
    4. mementoList.add(state);
    5. }
    6. public Memento get(int index){
    7. return mementoList.get(index);
    8. }
    9. }

    1. @Test
    2. public void test19(){
    3. Originator originator = new Originator();
    4. CareTaker careTaker = new CareTaker();
    5. originator.setState("State #1");
    6. originator.setState("State #2");
    7. careTaker.add(originator.saveStateToMemento());
    8. originator.setState("State #3");
    9. careTaker.add(originator.saveStateToMemento());
    10. originator.setState("State #4");
    11. System.out.println("Current State: " + originator.getState());
    12. originator.getStateFromMemento(careTaker.get(0));
    13. System.out.println("First saved State: " + originator.getState());
    14. originator.getStateFromMemento(careTaker.get(1));
    15. System.out.println("Second saved State: " + originator.getState());
    16. }
    17. /*
    18. Current State: State #4
    19. First saved State: State #2
    20. Second saved State: State #3
    21. */

  • 相关阅读:
    牛客网:NC142 最长重复子串
    【Springboot】整合kafka
    NIO基础[三大组件,文件以及网络编程]
    如何保证消息的顺序性
    ros改进算法路径规划仿真
    Postgresql数据类型-时间类型
    力扣383. 赎金信
    并发安全问题之--事物失效问题
    声音信号处理笔记(一)
    AC笔记 | 领扣Java容器脚手架
  • 原文地址:https://blog.csdn.net/weixin_44233087/article/details/133979017