标签:
备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
我们在这种模式中一般有三个角色:
1、Originator发起人角色
记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
2、Memento备忘录角色
负责存储Originator发起人对象内部的状态,在需要的时候提供发起人需要的内部状态。
3、Caretaker备忘录管理员角色
对备忘录进行管理、保存和提供备忘录。
类图如下:
实现代码如下:
Originator类:
package com.designpatterns.memento; /** * @author WSYW126 * @version 2016年5月6日下午9:23:52 */ public class Originator { private String state = ""; public String getState() { return state; } public void setState(String state) { this.state = state; } public void restoreMemento(Memento memento) { this.setState(memento.getState()); } public Memento createMemento() { return new Memento(this.state); } }
package com.designpatterns.memento; /** * @author WSYW126 * @version 2016年5月6日下午9:25:11 */ public class Memento { private String state = ""; public Memento(String state) { this.setState(state); } public String getState() { return state; } public void setState(String state) { this.state = state; } }
package com.designpatterns.memento; /** * @author WSYW126 * @version 2016年5月6日下午9:27:49 */ public class Caretaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } }
package com.designpatterns.memento; /** * @author WSYW126 * @version 2016年5月6日下午9:28:22 */ 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()); } }
不过由于java语言的特性,我们可以利用clone方法实现我们的备忘录模式。
类图如下:
实现类如下:
Originator类:
package com.designpatterns.memento.clone; /** * @author WSYW126 * @version 2016年5月6日下午9:23:52 */ public class Originator implements Cloneable { private String state = ""; public String getState() { return state; } public void setState(String state) { this.state = state; } public void restoreMemento(Originator memento) { this.setState(memento.getState()); } public Originator createMemento() { return (Originator) this.clone(); } @Override public Originator clone(){ try { return (Originator) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } }
package com.designpatterns.memento.clone; /** * @author WSYW126 * @version 2016年5月6日下午9:27:49 */ public class Caretaker { private Originator memento; public Originator getMemento() { return memento; } public void setMemento(Originator memento) { this.memento = memento; } }
package com.designpatterns.memento.clone; /** * @author WSYW126 * @version 2016年5月6日下午9:28:22 */ 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()); } }
package com.designpatterns.memento.clonewithnocaretaker; /** * @author WSYW126 * @version 2016年5月6日下午9:23:52 */ public class Originator implements Cloneable { private String state = ""; private Originator memento=null; public String getState() { return state; } public void setState(String state) { this.state = state; } public void restoreMemento() { this.setState(this.memento.getState()); } public void createMemento() { this.memento=this.clone(); } @Override public Originator clone() { try { return (Originator) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } }
package com.designpatterns.memento.clonewithnocaretaker; /** * @author WSYW126 * @version 2016年5月6日下午9:28:22 */ public class Client { public static void main(String[] args) { Originator originator = new Originator(); originator.createMemento(); originator.restoreMemento(); } }这样的实现精简了很多,而且高层模块的依赖也减少了。
参考资料:
设计模式之禅
备注:
转载请注明出处
http://blog.csdn.net/wsyw126/article/details/51334700
by WSYW126
标签:
原文地址:http://blog.csdn.net/wsyw126/article/details/51334700