目录
定义
Without violating encapsulation,capture and externalize an object's internal
state so that the object can be restored to this state later.(在不破坏封装性的前提
下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该
对象恢复到原先保存的状态。)
● Originator 发起人角色
记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备
忘录数据。
● Memento 备忘录角色(简单的 javabean)
负责存储 Originator 发起人对象的内部状态,在需要的时候提供发起人需要的内部
状态。
● Caretaker 备忘录管理员角色(简单的 javabean)
对备忘录进行管理、保存和提供备忘录。
使用场景
● 需要保存和恢复数据的相关状态场景。
● 提供一个可回滚(rollback)的操作。
● 需要监控的副本场景中。
● 数据库连接的事务管理就是用的备忘录模式。
注意:
●备忘录的生命期
●备忘录的性能
不要在频繁建立备份的场景中使用备忘录模式(比如一个 for 循环中)。
clone 方式备忘录:
● 发起人角色融合了发起人角色和备忘录角色,具有双重功效
多状态的备忘录模式
● 增加了一个 BeanUtils 类,其中 backupProp 是把发起人的所有属性值转换到
HashMap 中,方便备忘录角色存储。restoreProp 方法则是把 HashMap 中的值返
回到发起人角色中。
BeanUtil 工具类代码
public class BeanUtils { //把 bean 的所有属性及数值放入到 Hashmap 中 public static HashMap<String, Object> backupProp(Object bean) { HashMap<String, Object> result = new HashMap<String, Object>(); try { //获得 Bean 描述 BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass()); //获得属性描述 PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors(); //遍历所有属性 for (PropertyDescriptor des : descriptors) { //属性名称 String fieldName = des.getName(); //读取属性的方法 Method getter = des.getReadMethod(); //读取属性值 Object fieldValue = getter.invoke(bean, new Object[]{}); if (!fieldName.equalsIgnoreCase("class")) { result.put(fieldName, fieldValue); } } } catch (Exception e) { //异常处理 } return result; } //把 HashMap 的值返回到 bean 中 public static void restoreProp(Object bean, HashMap<String, Object> propMap) { try { //获得 Bean 描述 BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass()); //获得属性描述 PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors(); //遍历所有属性 for (PropertyDescriptor des : descriptors) { //属性名称 String fieldName = des.getName(); //如果有这个属性 if (propMap.containsKey(fieldName)) { //写属性的方法 Method setter = des.getWriteMethod(); setter.invoke(bean, new Object[]{propMap.get(fieldName)}); } } } catch (Exception e) { //异常处理 System.out.println("shit"); e.printStackTrace(); } } }多备份的备忘录:略
封装得更好一点:保证只能对发起人可读
●建立一个空接口 IMemento——什么方法属性都没有的接口,然后在发起人
Originator 类中建立一个内置类(也叫做类中类)Memento 实现 IMemento 接口,
同时也实现自己的业务逻辑。
有用请点赞,养成良好习惯!
疑问、交流、鼓励请留言!
Java设计模式之备忘录模式(Memento Pattern)
最新推荐文章于 2025-06-02 17:14:41 发布
本文详细介绍了Java备忘录模式的定义,包括发起人、Memento和Caretaker的角色。通过实例演示BeanUtil工具在数据备份和恢复中的作用,特别关注备忘录的生命期和性能。适合理解状态管理在复杂系统中的应用。
1856





