备忘录模式
# 概念
在不破坏封装性的前提下,** 捕获一个对象的内部状态,** 并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
# 使用场景
- 需要保存和恢复数据的相关状态场景。
- 提供一个可回滚(rollback)的操作。
- 需要监控的副本场景中。
- 数据库连接的事务管理就是用的备忘录模式。
# 结构
*Originator 发起人角色:* 记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
*Memento 备忘录角色:* 负责存储 Originator 发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
*Caretaker 备忘录管理员角色:* 对备忘录进行管理、保存和提供备忘录。
# 代码示例
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();
}
}
}
上次更新: 2022/12/31, 03:04:26