设计模式--备忘录模式Memento(行为型)
来源:互联网 发布:性喜剧 知乎 编辑:程序博客网 时间:2024/05/19 03:46
1 定义:
1.1 定义:Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later. (在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。)
1.2 通用类图:
个人认为更易理解的类图
Originator发起人角色
记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
Memento备忘录角色
负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
Caretaker备忘录管理员角色
对备忘录进行管理、保存和提供备忘录。
1.3 通用代码:
public class Originator {// 内部状态private String state = "";public String getState() {return state;}public void setState(String state) {this.state = state;}// 创建一个备忘录public Memento createMemento() {return new Memento(this.state);}// 恢复一个备忘录public void restoreMemento(Memento _memento) {this.setState(_memento.getState());}}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;}}public class Caretaker {// 备忘录对象private Memento memento;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}}public class Client {public static void main(String[] args) {// 定义出发起人Originator originator = new Originator();// 定义出备忘录管理员Caretaker caretaker = new Caretaker();// 创建一个备忘录caretaker.setMemento(originator.createMemento());// 恢复一个备忘录originator.restoreMemento(caretaker.getMemento());}}
2 优点
暂无
3 缺点
暂无
4 应用场景
4.1 需要保有存和恢复数据的相关状态场景;
4.2 提供一个可回滚的操作;
4.3 需要监控的副本场景中;(如要监控一个对象的属性,但监控又不应该作为系统的主业务来调用,它只是边缘应用,即使出现监控不准、错误报警也影响不大。)
4.4 数据库中的事务处理就使用备忘录模式。
5 注意事项
5.1 备忘录的生命周期:创建就要使用,要主动管理它的生命。
5.2 备忘录的性能:不要在频繁建立备份的场景中使用备忘录模式(比如一个for循环中),原因是:一是控制不了其数量,二是大对象的建立是要消耗资源的,系统的性能需要考虑。
6 扩展
6.1 clone方式的备忘录:通过复制的方式产生一个对象的内部状态,类图如下:
从类图上来看,发起人角色融合了发起人角色和备忘录角色,代码如下:
测试:
当前状态:version 1.0.0
修改后状态:version 2.0.0
恢复后状态:version 1.0.0
仍可以进一步精简,去掉管理备忘录角色
6.2 多状态的备忘录模式:实际开发中,一个对象可能有多个状态,一个JavaBean有多个属性非常常见,如果随上所述,就要写一堆的状态备份、还原语句?这里介绍一个工具类BeanUtils,可以把类的所有属性值转换到HashMap中,亦可以把HashMap中的值放入对象中。
此方案的类图如下:
源代码如下:
通过这种方式,无论有多少状态都可以。
6.3 多备份的备忘录:可在通用源码上添加如下即可:
6.4 更好的封装:双接口(一个类可以实现多个接口,在系统设计时,如果考虑对象的安全问题,可以提供两个接口,一个是业务的正常接口,实现必要的业务逻辑,叫做宽接口;另外一个接口是一个空接口,什么方法都没有,其目的是提供给子系统外的模块访问,因此较安全。)
类图如下:
源代码如下:
内置类Memento全部是private访问权限,也就是说除了发起人外,别人休想访问到,如果要产生关联关系,就通过空接口进行。
转自:http://blog.csdn.net/yuanlong_zheng/article/details/7584848
- [设计模式-行为型]备忘录模式(Memento)
- 设计模式(4)-行为型-备忘录模式(Memento)
- 设计模式--备忘录模式Memento(行为型)
- 设计模式-行为型- 备忘录模式(Memento)
- 行为型模式-----备忘录模式(Memento)
- 十八、备忘录模式Memento(行为型)
- 备忘录模式Memento(对象行为型)
- 行为型模式-备忘录memento
- 行为模式:Memento(备忘录)
- 行为设计模式---备忘录模式(Memento)
- 【设计模式】行为模式之备忘录Memento
- 设计模式笔记--行为型模式之六--Memento 备忘录
- 设计模式(18)-行为型-备忘录模式(Memento)
- 设计模式(行为型)之备忘录模式(Memento Pattern)
- JAVA设计模式(19) —<行为型>备忘录模式(Memento)
- 设计模式学习之备忘录模式(Memento,行为型模式)(19)
- 设计模式学习之备忘录模式(Memento,行为型模式)(19)
- 设计模式学习之备忘录模式(Memento,行为型模式)(19)
- 客户端防表单重复提交和服务器端session防表单重复提交
- TRANCATE TABLE与DETELE TABLE的区别
- 测试程序运行时间
- Maven 手动添加 JAR 包到本地仓库
- Visual.Studio程序员箴言 - 笔记
- 设计模式--备忘录模式Memento(行为型)
- Android屏幕分辨率的获取方法
- ajax发送get、post请求
- 初级linux中常遇到的问题整理
- (3)html列表
- Python开发——字符串format
- 在使用vector的push_back函数时,Release版下运行会出错的一个原因
- unix环境高级编程 FILE I/O笔记
- Observer(观察者)模式的代码演示