登陆注册
8183300000139

第139章 7 备忘录模式的实现

小A:“备忘录模式要怎么去实现?”

大B:“我详细给你说。”

1、备忘录模式中的角色

发起人:创建含有内部状态的备忘录对象,并使用备忘录对象存储状态。

负责人:负责人保存备忘录对象,但不检查备忘录对象的内容。

备忘录:备忘录对象将发起人对象的内部状态存起来,并保证其内容不被发起人对象之外的对象像读取。

注意:在备忘录的角色中,定义了他必须对不同的人提供不同的接口,对发起人提供宽接口,对其它任何人提供窄。

接口:也许你说我都提供宽接口了。这也是备忘录的一种实现,叫做白箱备忘录,不过这种方法的封装没有设计。好,安全性不够好。

2、白箱备忘录的实现:

public class Originator{

private String state;

public Memento CreateMemento(){

return new Memento(state);

}

public void restoreMemento(Memento memento){

this。state=memento。getState();

}

public String getState(){

return this。state;

}

public void setState(String state){

this。state=state;

System。out。println(“Current state=” this。state);

}

}

public class Memento{

private String state;

public Memento(String state){

this。state=state;

}

public String getState(){

return this。state;

}

public void setState(){

this。state=state;

}

}

public class Caretaker{

private Memento memento;

public Memento retrieveMemento(){

return this。memento;

}

public void saveMemento(Memento memento){

this。memento=memento;

}

}

public class Client{

private static Originator o=new Originator();

private static Caretaker c=new Caretaker();

public static void main(Sting[]args){

o。setState(“ON”);

c。saveMemento(o。createMemento());

o。setState(“OFF”);

o。restoreMemento(c。retrieveMemento());

}

}

白箱的优点:实现简单。

白箱的缺点:上边说了,破坏了封装,安全性有些问题。

说明:这里白箱的实现只保存了一个状态,其实是可以保存多个状态的。

3、双接口的实现,宽窄接口(黑箱)

如何实现宽窄接口呢?内部类也许是个好方法。我们把备忘录类设计“成发起人”的内部类,但这样还有的问题是同一package中的其它类也能访问到,为了解决这个问题,我们可以把“备忘录”的方法设计成私有的方法,这样就可以保证封装,又保证发起人能访问到。实现如下:

定义窄接口。

public interface NarrowMemento{

public void narrowMethod();

}

class Originator{

private

String state;

private NarrowMemento memento;

public Originator(){

}

public NarrowMemento createMemento(){

memento=new Memento(this。state);

return memento;

}

public void restoreMemento(NarrowMemento memento){

Memento aMemento=(Memento)memento;

this。setState(aMemento。getState());

}

public String getState(){

return this。state;

}

public void setState(String state){

this。state=state;

}

//内部类

protected class Memento implements NarrowMemento{

private String savedState;

private Memento(String someState){

saveState=someState;

}

private void setState(String someState){

saveState=someState;

}

private String getState()

{

return saveState;

}

public void narrowMethod(){

System。out。println(“this is narrow method”);

}

}

public NarrowMemento getNarrowMemento(){

return memento;

}

}

public class Caretaker{

private NarrowMemento memento;

public NarrowMemento retrieveMemento(){

return this。memento;

}

public void saveMemento(NarrowMemento memento){

this。memento=memento;

}

}

public class Client{

private static Originator o=new Originator();

private static Caretaker c=new Caretaker();

public static void main(String[]args){

//use wide interface

o。setState(“On”);

c。saveMemento(o。createMemento());

o。setState(“Off”);

o。restoreMemento(c。retrieveMemento());

//use narrow interface

NarrowMemento memento=o。getNarrowMemento();

memento。narrowMethod();

}

}

大B:“还要注意的是:1、前边两个例子都是记录了单个状态(单check点),要实现多个状态点很容易,只须要把记录state的字符串换成一个list,然后添加,取得。如果须要随机须得状态点,也可以用map来存放。这样多个check点就实现了。2、一般情况下可以扩展负责人的功能,让负责人的功能更强大,从而让客户端的操做更少些。解放客户端。3、自述历史模式,这个就是把发起人,负责人写在一个类中,平时的应用中这种方法比较常见。”

同类推荐
  • 中国3D打印的未来

    中国3D打印的未来

    自2012年以来,有关3D打印的报道屡见报端,这一新型制造技术引起了全世界的广泛关注。《中国3D打印的未来》作者、中国3D打印技术产业联盟秘书长罗军认为,中国从20世纪90年代初开始涉足3D打印技术,并取得了巨大进展,但与国外同行相比仍存在一定差距。特别是中国3D打印企业普遍存在“小而散”、各自为政的现象,如何发挥整合优势、抱团发展是目前亟需解决的问题。如果能够加强同行合作,抱团发展,形成合力,相信3D打印会成为唯一一项中国有可能赶超世界先进水平的技术。
  • 体感交互技术

    体感交互技术

    本书提出了体感计算的研究,探讨了基于体验性认知的个性化电子学习方式,并且分析了面向儿童的艺术创造体验,在体感虚拟化身的帮助下,用户可以通过身体运动,促进情感心智的全面发展,
  • 大话设计模式

    大话设计模式

    本书主要采用JAVA语言介绍设计模式中比较常见的23种设计模式,分29章具体介绍,以现实生活中常见的事情为例来具体分析讲解。
  • 组态软件控制技术

    组态软件控制技术

    监控组态软件是完成数据采集与过程控制的专用软件,它以计算机为基本工具,为实施数据采集、过程监控、生产控制提供了基础平台和开发环境。本书从应用角度出发,详细介绍了组态软件应用程序的开发过程。对窗口界面编辑、动画链接、实时和历史趋势、安全机制、I/O设备连接,以及生产应用等内容都做了非常详细的介绍。MCGS是优秀的监控组态软件之一,它功能强大、使用方便,可以非常容易地实现监视、控制、管理的各项功能,并可提供软、硬件的全部接口,方便、快速地进行系统集成,构成不同需求的数据采集与监控系统。本书可作为高等学校计算机应用、自动控制、电子技术、机电技术专业的教材,同时还可作为相关专业工程技术人员的自学用书。
热门推荐
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 女神系統

    女神系統

    “叮咚!恭喜你拥有女神系统!”“叮什么叮,咚你个咚,黑电脑找我这样一穷二白的人忽悠什么忽悠。”原本在电脑上做设计图的年素显得无所畏惧。对话筒冷冷传声,面对屏幕突如其来的乱码,失去了电脑控制权。“女神系统并不是忽悠。”“别以为你跟我扯这些幺蛾子我就信了。”当屏幕连同主机开始冒烟,轰然爆炸,那些电子设备们无一善终,已经缩到角落里的年素面色铁青。那阴魂不散的声音如同是在年素脑海中那样重新响起:“这回相信了吗,亲爱的女神宿主。”
  • 一城烟沙

    一城烟沙

    第一次见到叶子君,何禾就爱上了这个“有夫之女”。第二次见到叶子君,何禾就成了她的“冒牌男友”。相识三年,何禾为叶子君掏肝掏肺。相识三年,何禾对叶子君倾心相助。他想他不会再爱上其他女子,却发现叶子君的室友白玲对他已倾慕许久。面对爱与不爱,他选择了前者。“我的眼睛看湿了你的肩膀,而你从未路过我的身旁。”这是他写给叶子君的诗句,昭然着那份痴情,悲伤着那份苦恋,然而他付出的爱终究全付之东流的水。在绝望中,他接受了白玲,一个爱他而他不爱的女子。只因今生错爱,已不盼来世聚首。等到他心绪平复,想过……--情节虚构,请勿模仿
  • 破屋皇子穿越古今

    破屋皇子穿越古今

    宫廷之上:“你辱我母!我要你死!”少年一字一顿地恶狠狠吐出这八个字。“儿臣不懂亦不想懂。大不了儿臣不去做大庆的皇帝便罢。谁爱做谁去做去。我不再做了。皇家之子有什么好?我们要看见这人性最深的坑脏。儿臣为了皇位就要自己的额娘献身他人吗?我宁愿生在平常人家,父慈子孝,共享天伦。”皇子跌跌撞撞,哭泣地吼道。奇葩家族:童龀之年,余倾城路遇一个面脸污泥、衣衫褴褛的老者。老者握住倾城的手,眼皮乱跳,大惊道:“此女骨骼轻奇,以后贵不可言。看她天庭饱满,骨骼圆润,以后必是皇妃之相”余倾城昂起小小脸,一脸不解地哭诉道“现代皇帝都没了,哪来的皇妃?妈妈,他说我脸大脸圆。”“皇子哥哥,你是从哪里来的啊?”皇子并不答话只是用手指了指墙面。余倾城定睛一看上面赫然写着“XXX精神病院”?!宫廷森森:“琴棋书画,你会哪一样?”“一样都不会”“那你怎么被选入宫的?”“因为。。。。。爱情”“。。。。。。。”我也不知道我为什么会在这里。但是他在我就一定会在
  • 一吻成瘾:夜少,别来无恙

    一吻成瘾:夜少,别来无恙

    “清风,我们要永远在一起玩捉迷藏”“好”那年他9岁,她5岁“清风,我们要永远在一起看下雪”“好”那年他13岁,她9岁“清风,我们要永远在一起演奏,你唱歌,我伴舞”“好”那年他18岁,她14岁“兮兮,等我回来”“好”那一次换了她说好。那年他22岁,她18岁可是等回来的却是........在她看来她说的每一次誓言他都不在乎,永远都只有一个字来敷衍她而在他的心里,他的那一句好却是饱含深情。
  • 论神器的可使用性

    论神器的可使用性

    传说中的仙器遗落在四方,何人能够使用仙器?仙器将给人世间带来怎样的改变?看一个小和尚和小道士的寻找仙器的路途,以及他们看到的一个个故事。
  • 我是阴阳大宝剑

    我是阴阳大宝剑

    主角:乔杉。本是一弃婴。十八年后他得知自己不仅是阴阳之命,还是一柄‘阴阳大宝剑’转世。从此他踏上了斩妖驱鬼、除魔灭灵之路。恐怖的僵尸、邪恶的厉鬼、异国的恶灵……艳丽的女阴差、火爆的极品校花……我叫:乔杉。我是阴阳大宝剑,斩尽世间邪恶的大宝剑!
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 修仙矿业有限公司

    修仙矿业有限公司

    你如果有一块煤,你可以在寒冷的冬天得到一小会的温暖。你如果有十块煤,那你可以得到一天的温暖。你如果有一百块煤,那你可以得到十天的温暖。你如果有一千块煤,那你可以一个冬季都温暖。那....如果你有一万块,十万块,一百万块甚至一千万块煤呢?又或者不是煤呢?
  • 流年之微光

    流年之微光

    她,出生在一个畸形的家庭,母亲是精神病人,父亲是残疾人。她懵懵懂懂的过完了童年,那童年是无知但却幸福的,她对未来抱有无限的幻想,虽然没有母亲的陪伴,但是父亲是伟大的,她喜欢父亲的肩膀,她是父亲的小公举,有着一座城堡。后来一切都变了……