java设计模式之备忘录模式

《JAVA与模式》之备忘录模式(转自博客园)wwcnblogs/java-my-life/archive/2012/06/06/2534942在阎宏博士的《JAVA与模式》一书中开头是这样描述备忘录(Memento)模式的:备忘录模式又叫做快照模式(SnapshotPattern)或Token模式,是对象的行为模式。备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。备忘录模式的结构备忘录模式的结构图如下所示备忘录模式所涉及的角色有三个:备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色。备忘录(Memento)角色备忘录角色又如下责任:(1)将发起人(Originator)对象的内战状态存储起来。备忘录可以根据发起人对象的判断来决定存储多少发起人(Originator)对象的内部状态。(2)备忘录可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。备忘录有两个等效的接口:●窄接口:负责人(Caretaker)对象(和其他除发起人对象之外的任何对象)看到的是备忘录的窄接口(narrowinterface),这个窄接口只允许它把备忘录对象传给其他的对象。●宽接口:与负责人对象看到的窄接口相反的是,发起人对象可以看到一个宽接口(wideinterface),这个宽接口允许它读取所有的数据,以便根据这些数据恢复这个发起人对象的内部状态。发起人(Originator)角色发起人角色有如下责任:(1)创建一个含有当前的内部状态的备忘录对象。(2)使用备忘录对象存储其内部状态。负责人(Caretaker)角色负责人角色有如下责任:(1)负责保存备忘录对象。(2)不检查备忘录对象的内容。“白箱”备忘录模式的实现备忘录角色对任何对象都提供一个接口,即宽接口,备忘录角色的内部所存储的状态就对所有对象公开。因此这个实现又叫做“白箱实现”。“白箱”实现将发起人角色的状态存储在一个大家都看得到的地方,因此是破坏封装性的。但是通过程序员自律,同样可以在一定程度上实现模式的大部分用意。因此白箱实现仍然是有意义的。下面给出一个示意性的“白箱实现”。源代码发起人角色类,发起人角色利用一个新创建的备忘录对象将自己的内部状态存储起来。publicclassOriginator{privateStringstate;/***工厂方法,返回一个新的备忘录对象*/publicMementocreateMemento(){returnnewMemento(state);}/***将发起人恢复到备忘录对象所记载的状态*/publicvoidrestoreMemento(Mementomemento){this.state=memento.getState();}publicStringgetState(){returnstate;}publicvoidsetState(Stringstate){this.state=state;System.out.println("当前状态:"+this.state);}}备忘录角色类,备忘录对象将发起人对象传入的状态存储起来。publicclassMemento{privateStringstate;publicMemento(Stringstate){this.state=state;}publicStringgetState(){returnstate;}publicvoidsetState(Stringstate){this.state=state;}}负责人角色类,负责人角色负责保存备忘录对象,但是从不修改(甚至不查看)备忘录对象的内容。publicclassCaretaker{privateMementomemento;/***备忘录的取值方法*/publicMementoretrieveMemento(){returnthis.memento;}/***备忘录的赋值方法*/publicvoidsaveMemento(Mementomemento){this.memento=memento;}}客户端角色类publicclassClient{publicstaticvoidmain(String[]args){Originatoro=newOriginator();Caretakerc=newCaretaker();//改变负责人对象的状态o.setState("On");//创建备忘录对象,并将发起人对象的状态储存起来c.saveMemento(o.createMemento());//修改发起人的状态o.setState("Off");//恢复发起人对象的状态o.restoreMemento(c.retrieveMemento());System.out.println(o.getState());}}在上面的这个示意性的客户端角色里面,首先将发起人对象的状态设置成“On”,并创建一个备忘录对象将这个状态存储起来;然后将发起人对象的状态改成“Off”;最后又将发起人对象恢复到备忘录对象所存储起来的...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

文秘专家
机构认证
内容提供者

1

确认删除?