java 开发模式之二十一:备忘录模式

来源:互联网 发布:mac截图存在哪里 编辑:程序博客网 时间:2024/06/10 01:02

原理或定義

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。是对象的行为模式

结构

发起人(Originator创建一个含有当前的内部状态的备忘录对象使用备忘录对象存储其内部状态。

備忘錄接口(MementoIF)窄接口,这是一个标识接口,因此它没有定义出任何的方法

備忘錄實現類:

负责人(Caretaker负责保存备忘录对象不检查备忘录对象的内容

 

類圖

使用場景

本文使用游戏进度状态保存问题作为示例


游戏进度保存:对象状态,场景...


备忘录设计模式:


类图:



備忘錄接口(MementoIF)

public interface MementoIF {}

负责人(Caretaker

public class MementoCaretaker {private HashMap<String, MementoIF> mementomap;public MementoCaretaker() {mementomap = new HashMap<String, MementoIF>();}public MementoIF retrieveMemento(String name) {return mementomap.get(name);}/** * 备忘录赋值方法 */public void saveMemento(String name, MementoIF memento) {this.mementomap.put(name, memento);}}

发起人(Originator

public class Originator {private HashMap<String, String> state;public Originator() {state = new HashMap();}public MementoIF createMemento() {return new Memento(state);}public void restoreMemento(MementoIF memento) {state = ((Memento) memento).getState();}public void showState() {System.out.println("now state:" + state.toString());}public void testState1() {state.put("blood", "500");state.put("progress", "gate1 end");state.put("enemy", "5");}public void testState2() {state.put("blood", "450");state.put("progress", "gate3 start");state.put("enemy", "3");}private class Memento implements MementoIF {private HashMap<String, String> state;private Memento(HashMap state) {this.state = new HashMap(state);}private HashMap getState() {return state;}private void setState(HashMap state) {this.state = state;}}}
public class Originator2 {private ArrayList<String> state;public Originator2() {state = new ArrayList<String>();}public MementoIF createMemento() {return new Memento(state);}public void restoreMemento(MementoIF memento) {state = ((Memento) memento).getState();}public void testState1() {state = new ArrayList<String>();state.add("blood:320");state.add("progress:gate2 mid");state.add("enemy:15");}public void testState2() {state = new ArrayList<String>();state.add("blood:230");state.add("progress:gate8 last");state.add("enemy:12");}public void showState() {System.out.println("now state:" + state.toString());}private class Memento implements MementoIF {private ArrayList<String> state;private Memento(ArrayList<String> state) {this.state = new ArrayList(state);}private ArrayList<String> getState() {return state;}private void setState(ArrayList<String> state) {this.state = state;}}}

测试类:

public class MainTest {public static void main(String[] args) {MementoCaretaker mMementoCaretaker = new MementoCaretaker();Originator mOriginator = new Originator();Originator2 mOriginator2 = new Originator2();System.out.println("*****Originator*****");mOriginator.testState1();mMementoCaretaker.saveMemento("Originator", mOriginator.createMemento());mOriginator.showState();mOriginator.testState2();mOriginator.showState();mOriginator.restoreMemento(mMementoCaretaker.retrieveMemento("Originator"));mOriginator.showState();System.out.println("*****Originator 2*****");mOriginator2.testState1();mOriginator2.showState();mMementoCaretaker.saveMemento("Originator2",mOriginator2.createMemento());mOriginator2.testState2();mOriginator2.showState();mOriginator2.restoreMemento(mMementoCaretaker.retrieveMemento("Originator2"));mOriginator2.showState();//System.out.println("*****Originator&&Originator 2*****");// mOriginator.restoreMemento(mMementoCaretaker// .retrieveMemento("Originator2"));// mOriginator.showState();}}

在不破坏封装的前提下,存储关键对象的重要状态,从而可以在将来把对象还原到存储的那个状态


使用場景

1、需要保存和恢复数据的相关状态场景

2、提供一个可回滚操作

3、需要监控的一个副本场景中。例如要监控一个对象的属性,但是监控又不应该作为系统的主业务来调用,它只是边缘应用,即使出现监控不准,错误报警也影响不大,因此一般的做法是备份一个主线程的对象,然后由分析程序来分析。

4、数据库连接的事务管理就是用的备忘录模式。

優缺點

主要优点有:

1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。

2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。

3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原

缺点主要有

1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。

2、当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。

3、当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取假如协议模式

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 万用表测量380v电机好坏图解 万用表测量电机好坏图解 万用表测电机好坏图解 万用表测量电流图解 万用表测量led灯好坏图解 万用表电阻测量方法图解 速学万用表检测100例 万用表上的符号图解 电子万用表的使用方法 数字万用表的使用方法 数字万用表使用教程 万用表直流电压符号 什么牌子的万用表好 钳形万用表什么牌子好 国产万用表品牌排行榜 数字万用表哪个牌子好 福禄克万用表哪个型号好 数字万用表什么牌子好 万用表什么牌子的好 福禄克万用表保险丝 使用万用表的注意事项 万用电表的使用方法 多用表 万用 万尾金滩旅游 万金逃妻叶少请温柔 万尾金滩 浦发万用金欠28万被起诉 倍富金与万用金区别 万用金怎么申请 万用金是什么 浦发万用金10万多少利息 零用金 浦发万用金利息 万用金利息 万用金多久到账 万用金怎么还款 万用金利率 浦发万用金全面停止 2018浦发万用金全面停止 无领导面试万用金句