150 likes | 354 Views
Design Patterns ---Memento. Design Patterns classification:. 行为模式. 创建模式. 备忘录模式. 结构模式. 备忘录 :. 定义及目的 类 图 结构 使用举例 适用 情况 缺陷. 1. 定义. 备忘录是这样一种模式: 在不破坏 封装性 的前提下,捕获一个对象的 内部状态 ,并在该对象之外 保存 这个状态。这样以后就可将该对象 恢复 到原先保存的状态。 2. 目的 想要 恢复 对象某时的 原有状态. 类图结构:. client. originator.
E N D
Design Patterns classification: 行为模式 创建模式 备忘录模式 结构模式
备忘录: • 定义及目的 • 类图结构 • 使用举例 • 适用情况 • 缺陷
1.定义 备忘录是这样一种模式: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。2.目的 想要恢复对象某时的原有状态
类图结构: client originator 《Interface》 Memento Caretaker
Originator:发起人角色,主要完成如下工作:创建一个含有当前的内部状态的备忘录对象;使用备忘录对象存储其内部状态。Originator:发起人角色,主要完成如下工作:创建一个含有当前的内部状态的备忘录对象;使用备忘录对象存储其内部状态。 Memento:备忘录角色, 主要负责的工作如下:将发起人对象的内部状态存储起来;可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。Caretaker:负责人角色,完成工作如下:负责保存备忘录对象; 因为备忘录对象记录的的发起人对象的内部状态,除了发起人,其他任何对象都不能读取并修改里面的内容。 不保存备忘录对象的内容! Why???
使用举例: 1)需求Anna的mother对nana当前的状态很不满意:不爱打扮,做事拖拖拉拉,十足马大哈。该mother想对Anna进行改造,但又唯恐改造后还不如从前的Anna好,有可能需要实现“时光倒流”功能。2)分析经过细细分析,这个状态保存功能其实可以通过备忘录模式来得到很好的实现,可通过备忘录来保存Anna当前的状态:不爱打扮,做事拖拖拉拉,十足马大哈,以及其它的N多缺点。如果改造后的Anna不如从前,那我们让我们的备忘录将其还原为以前的状态。
3)代码参考实现 i)发起人角色public class Originator {private String state;/*** 工厂方法,返回一个新的备忘录对象*/public Memento createMemento {return new Memento(state);}/*** 将发起人恢复到备忘录对象所记载的状态*/public void restoreMemento(Memento memento) {this.state = memento.getState();}//省略状态state的getter和setter方法 }
ii)备忘录角色//省略状态state的getter和setter方法public class Memento {private String state;/*** 构造函数*/public Memento(String state) {this.state = state;} }
iii)负责人角色public class Caretaker {private Memento memento;/*** 备忘录的取值方法*/public Memento retrieveMemento {return this.memento;}/*** 备忘录的保存方法*/public void saveMemento(Memento memento) {this.memento = memento;} //省略state的getter和setter方法}
运行结果将是anna恢复到以前的状态,这就是通过备忘录模式设计来实现的。运行结果将是anna恢复到以前的状态,这就是通过备忘录模式设计来实现的。 iv)客户端模拟实现public class Client {private static Originator ori = new Originator();private static Caretaker taker = new Caretaker();public static void main(String[] args) {//anna当前的状态ori.setState("不爱打扮,做事拖拖拉拉,十足马大哈");//保存anna当前的状态taker.saveMemento(ori.createMemento());//mother要对anna进行改造ori.setState("穿着时髦,做事精练");//mother发现改造后产生了很多副作用,于是反悔了,要恢复女儿以前的样子ori.restoreMemento(taker.retrieveMemento());//anna被打回原型System.out.println("amigo当前情况: " + ori.getState());}}
适用情况: 适用性(Applicability) 当下列情形时使用备忘录模式: 1. 一个对象状态某时的快照(即当时状态下的相关信息)必须储存以便未来可以回复到这个状态。 2.一个直接的接口获得状态将破坏对象的封装性。
适用情况举例: • eg1. 备忘录在jsp+javabean的使用:在一系统中新增帐户时,在表单中需要填写用户名、密码、联系电话、地址等信息,如果有些字段没有填写或填写错误,当用户点击“提交”按钮时,需要在新增页面上保存用户输入的选项,并提示出错的选项。这就是利用JavaBean的scope="request"或scope="session"特性实现的,即是用备忘录模式实现的。 • eg2. 修理汽车的刹车时。首先移开两边的挡板,露出左右刹车片。只能卸下一片,这时另一片作为一个备忘录来表明刹车是怎样安装的。在这片修理完成后,才可以卸下另一片。当第二片卸下时,第一片就成了备忘录。
缺陷: 使用备忘录模式可能是昂贵的: 备忘录模式可能导致可想象的负担;如果源头对象必须复制大量的信息储存在备忘录对象中。除非封装并恢复源头对象状态是便宜的,否则这个模式可能并不适当。 我们应该在适当的条件下选择备忘录模式,避免造成不必要的资源浪费。