湖北住房与城乡建设厅网站石家庄建站工具
news/
2025/10/6 5:11:56/
文章来源:
湖北住房与城乡建设厅网站,石家庄建站工具,个人网站设计模板,网站优化北京联系电话?在设计模式系列文章是阅读《设计模式之禅》之后自己新的加上在项目中的应用于思考#xff0c;想要系统深入学习的朋友还是建议学习一下《设计模式之禅》#xff0c;这本书中通过例子讲的更加循序渐进#xff0c;也更容易理解。
理解理念
这种模式旨在让程序能够记住一个或…在设计模式系列文章是阅读《设计模式之禅》之后自己新的加上在项目中的应用于思考想要系统深入学习的朋友还是建议学习一下《设计模式之禅》这本书中通过例子讲的更加循序渐进也更容易理解。
理解理念
这种模式旨在让程序能够记住一个或多个实体的属性或历史状态并且能够进行还原操作。这种问题的复杂性通常来自于“多”这个方面。如果我们只需要备份一个属性并且只需要备份最近的状态那么我们只需要创建一个与该属性相同的变量。同样地如果我们只需要备份少量对象并且对象属性也很少那么手动实现备份可能是可行的。但是如果项目中存在多个需要备份的对象并且这些对象的属性也很多那么我们需要使用工具来实现备份操作。因此我们抽象出了这种模式来帮助解决这类问题。
代码实现
对于上述复杂场景有两种备份实现思路。一种是让对象自己实现创建备份的接口另一种是专门创建一个对象来进行备份操作。在实现的细节方面如果对象内部只有基本数据类型的属性则不需要考虑深拷贝和浅拷贝。但是如果内部存在引用数据类型的属性则需要在拷贝赋值时使用深拷贝的方式。为了规范对象的属性和操作需要在项目中需要进行备份的对象中实现统一的克隆接口自定义一个备份接口并实现克隆方法。这样我们也可以在备份对象时进行检测和区分。
public class BeanUtils {public class BeanUtils {public static HashMapString, Object backupPro(Object bean){HashMapString,Object result new HashMap();try{BeanInfo beanInfo Introspector.getBeanInfo(bean.getClass());PropertyDescriptor[] propertyDescriptors beanInfo.getPropertyDescriptors();for (PropertyDescriptor des : propertyDescriptors) {String filedName des.getName();Method getter des.getReadMethod();Object filedValue getter.invoke(bean,new Object[]{});if (!filedName.equalsIgnoreCase(class)){result.put(filedName,filedValue);}}}catch (Exception e){System.out.println(程序自定义的异常处理);}return result;}public static void restorePro(Object bean,HashMapString,Object propMap){try{BeanInfo beanInfo Introspector.getBeanInfo(bean.getClass());PropertyDescriptor[] propertyDescriptors beanInfo.getPropertyDescriptors();for (PropertyDescriptor des : propertyDescriptors){String filedName des.getName();if (propMap.containsKey(filedName)){Method setter des.getWriteMethod();setter.invoke(bean,new Object[]{propMap.get(filedName)});}}}catch (Exception e){System.out.println(程序自定义的异常处理);}}
} public class Caretaker {/*** 双层Map是考虑建立以时间戳为维度的多个备份结合具体场景也可以设计成队列* 或是指定版本号的备忘录亦或是先进先出的队列等同时可以控制具体的大小*/private MapLong,MapString,Object mementoCollection new HashMap();public Long createMemento(Object bean){long timestamp System.currentTimeMillis();mementoCollection.put(timestamp,BeanUtils.backupPro(bean));return timestamp;}public void restoreBean(Long version,Object bean){BeanUtils.restorePro(bean, (HashMapString, Object) mementoCollection.get(version));}
}public class Originator{private String state1;private String state2;public Originator(){}public Originator(String state1, String state2) {this.state1 state1;this.state2 state2;}public String getState1() {return state1;}public void setState1(String state1) {this.state1 state1;}public String getState2() {return state2;}public void setState2(String state2) {this.state2 state2;}Overridepublic String toString() {return state1 state1 , state2 state2 \;}
}public class Client {public static void main(String[] args) {Originator originator new Originator(state1a,state2a);Caretaker caretaker new Caretaker();Long mementoVersion caretaker.createMemento(originator);originator.setState2(state2b);System.out.println(originator.toString());caretaker.restoreBean(mementoVersion,originator);System.out.println(originator.toString());}
}
项目应用
在内部项目——快速取数一个查询进来会有一个QueryContext里面记录着查询的状态信息以及上线文信息利用设计模式里面可以在关键节点对QueryContext进行备份当需要返回到某一个步骤进行操作的时候我们就获取指定版本的备份让程序在指定入口重新执行。这样避免了程序从头执行的不必要成本——前面的已经执行过了那就也没必要再执行了。这样不仅能节省资源而且也可以为用户提供更多的选择以及更高的使用体验——重新执行从错误的地方开始好了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929002.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!