【Java】23种设计模式——19.备忘录模式

定义

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获并外部化一个对象的内部状态,以便之后可以将该对象恢复到原先保存的状态。

核心角色

  1. Originator(原发器):需要保存状态的对象。
  2. Memento(备忘录):存储原发器内部状态的对象。
  3. Caretaker(管理者):负责保存和恢复备忘录对象。

应用场景

  • 需要保存对象状态快照以便回滚
  • 需要实现撤销/重做功能
  • 需要保存对象历史状态
  • 需要实现事务回滚机制

使用

  • 原发器

    /**
     * 备忘录模式:原发器
     * @Author:lyj
     * @Date:2025/5/21 09:54
     */
    public class Originator {
        private String state;
    
        /**
         * 设置状态
         * @param state
         */
        public void setMemento(String state)
        {
            this.state = state;
            System.out.println("原发器状态:" + state);
        }
    
        /**
         * 创建备忘录
         * @return
         */
        public Memento saveMemento() {
            return new Memento(state);
        }
    
        /**
         * 恢复备忘录
         * @param memento
         */
        public void restoreMemento(Memento memento) {
            this.state = memento.getState();
            System.out.println("原发器状态:" + state);
        }
    }
    
  • 备忘录

    /**
     * 备忘录模式:备忘录
     * @Author:lyj
     * @Date:2025/5/21 09:52
     */
    public class Memento {
        private String state;       // 状态
    
        public Memento(String state) {
            this.state = state;
        }
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    }
    
  • 管理者

    /**
     * 备忘录模式-管理者: 负责保存备忘录对象
     * @Author:lyj
     * @Date:2025/5/21 10:36
     */
    public class Caretaker {
        private List<Memento> mementoList = new ArrayList<>();
    
        /**
         * 添加备忘录对象
         * @param memento 备忘录对象
         */
        public void add(Memento memento) {
            mementoList.add(memento);
        }
        /**
         * 获取指定索引的备忘录对象
         * @param index 索引
         * @return 备忘录对象
         */
        public Memento get(int index) {
            return mementoList.get(index);
        }
    }
    

运行测试数据:

Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
// 设置并保存账套
originator.setMemento("状态1");
caretaker.add(originator.saveMemento());
originator.setMemento("状态2");
caretaker.add(originator.saveMemento());
// 恢复到指定状态
originator.restoreMemento(caretaker.get(0));

运行结果:
image

posted @ 2025-06-20 16:55  陆陆无为而治者  阅读(25)  评论(0)    收藏  举报