设计模式之备忘录模式

备忘录模式

  1. 备忘录模式原型图:

  2. 示例代码:

    // 抽象备忘录接口
    public interface Memento {
    }
    
    // 发起人角色
    @Data
    public class Originator {
    
        private String status;
    
        public Originator(String status) {
            this.status = status;
        }
    
        public Memento createMemento(){
            ConcreteMemento memento = new ConcreteMemento();
            memento.setStatus(this.status);
            return memento;
        }
    
        public void restoreMemento(Memento memento){
            this.status = ((ConcreteMemento) memento).getStatus();
        }
    
        // 备忘录角色
        @Data
        private static class ConcreteMemento implements Memento{
            private String status;
        }
    }
    
    // 备忘录管理员角色
    public class Caretaker {
    
        private final Stack<Memento> stack = new Stack<>();
    
        public Memento getMemento(){
            return stack.pop();
        }
    
        public void addMemento(Memento memento){
            stack.push(memento);
        }
    }
    
    // 测试
    public class MementoTest {
    
        public static void main(String[] args) {
            Caretaker caretaker = new Caretaker();
            Originator originator = new Originator("开始状态");
            caretaker.addMemento(originator.createMemento());
            System.out.println(originator);
            originator.setStatus("第一次修改状态");
            caretaker.addMemento(originator.createMemento());
            System.out.println(originator);
            originator.setStatus("第二次修改状态");
            caretaker.addMemento(originator.createMemento());
            System.out.println(originator);
            System.out.println("======开始恢复状态===========");
            originator.restoreMemento(caretaker.getMemento());
            System.out.println(originator);
            originator.restoreMemento(caretaker.getMemento());
            System.out.println(originator);
            originator.restoreMemento(caretaker.getMemento());
            System.out.println(originator);
    
        }
    }
    
    
  3. 总结:上述示例备忘录角色采用了私有静态内部类实现抽象接口的方式,主要是保证备忘录对发起人开放,具有宽访问权限,对其他类(Caretaker)对Memento具有窄访问权限.

    优点:简化了发起人实体类的职责,隔离状态的存储与获取,实现了信息的封装,并提供了状态回滚功能;

    缺点:消耗资源.

posted @   justKen  阅读(45)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示