当前位置:首页 > CN2资讯 > 正文内容

我的世界java备份在那个文件夹 我的世界java版备份

3天前CN2资讯


备忘录,备份曾经发生过的历史记录,以防忘记,之后便可以轻松回溯过往。想必我们曾经都干过很多蠢事导致糟糕的结果,当后悔莫及的时候已经是覆水难收了,只可惜这世界上没有后悔药,事后我们能做的只能去弥补过失,总结经验。除非穿越时空,时光倒流,利用爱因斯坦狭义相对论,超越光速回到过去,破镜重圆。

然而世界是残酷的,人类至今最快的载人交通工具连达到光速的万分之一都显得遥不可及,更别说超越了。光速,宇宙间永远无法打破的时空屏障,它像是上帝定义的常量C,将时间牢牢地套死在坐标轴上,自创世宇宙大爆炸开始就让它不断流逝,如同播放一部不可回退的电影一样,暮去朝来,谁也无法打破。

 

 但在计算机世界里,人类便是神一般的存在,各种回滚,倒退,载入历史显得稀松平常,例如数据库恢复、游戏存盘载入、操作系统快照恢复、打开备份文档、手机恢复出厂设置……为了保证极简风格,我们这里以文档操作来举例说明这个设计模式。

假设某位作者要写一部科幻小说,当他打开编辑器软件以及创建文档开始创作的时候,我们来思考下这个场景需要哪些类。很简单,首先我们得有一个文档类Doc。

1public class Doc { 2 private String title;//文章标题 3 private String body;//文章内容 4 5 public Doc(String title){//新建文档先命名 6 this.title = title; 7 this.body = ""; 8 } 9 10 public void setTitle(String title) { 11 this.title = title; 12 } 13 14 public String getTitle() { 15 return title; 16 } 17 18 public String getBody() { 19 return body; 20 } 21 22 public void setBody(String body) { 23 this.body = body; 24 } 25}

没什么好说的,一个简单的Java Bean,包括标题与内容。有了文档那一定要有编辑器去修改它了,看代码。

 

1public class Editor {//编辑器 2 private Doc doc;//文档引用 3 4 public Editor(Doc doc) { 5 System.out.println("<<<打开文档" + doc.getTitle()); 6 this.doc = doc; 7 show(); 8 } 9 10 public void append(String txt) { 11 System.out.println("<<<插入操作"); 12 doc.setBody(doc.getBody() + txt); 13 show(); 14 } 15 16 public void save(){ 17 System.out.println("<<<存盘操作"); 18 } 19 20 public void delete(){ 21 System.out.println("<<<删除操作"); 22 doc.setBody(""); 23 show(); 24 } 25 26 private void show(){//显示当前文本内容 27 System.out.println(doc.getBody()); 28 System.out.println("文章结束>>>\n"); 29 } 30}

当编辑器打开一个文档后会持有其引用,这里我们写在编辑器构造方法里。编辑器主要的功能当然是对文档进行更改了,依然保持简单的操作模拟,我们只加入append插入功能、delete清空功能,以及save存盘方法和最后的show方法用于显示文档内容。一切就绪,接下来看看我们的作者怎样写出一部惊世骇俗的科幻小说《AI的觉醒》。

1public class Author { 2 public static void main(String[] args) { 3 Editor editor = new Editor(new Doc("《AI的觉醒》")); 4 /* 5 <<<打开文档《AI的觉醒》 6 7 文章结束>>> 8 */ 9 editor.append("第一章 混沌初开"); 10 /* 11 <<<插入操作 12 第一章 混沌初开 13 文章结束>>> 14 */ 15 editor.append("\n 正文2000字……"); 16 /* 17 <<<插入操作 18 第一章 混沌初开 19 正文2000字…… 20 文章结束>>> 21 */ 22 editor.append("\n第二章 荒漠之花\n 正文3000字……"); 23 /* 24 <<<插入操作 25 第一章 混沌初开 26 正文2000字…… 27 第二章 荒漠之花 28 正文3000字…… 29 文章结束>>> 30 */ 31 editor.delete(); 32 /* 33 <<<删除操作 34 35 文章结束>>> 36 */ 37 } 38}

鬼才作者开始了创作,一切进行地非常顺利,一气呵成写完了二章内容(第22行操作),于是他离开电脑去倒了杯咖啡,噩耗在此间发生了,他的熊孩子不知怎么就按下了Ctr+A,Delete触发了第31行的操作,导致全文丢失,从内存里被清空,而且离开前作者疏忽大意也没有进行存盘操作,这下彻底完了,5000字的心血付诸东流。

此场景该如何是好?大家都想到了Ctr+z的操作吧?它可以瞬间撤销上一步操作并回退到前一个版本,不但让我们有吃后悔药的机会,而且还不需要频繁的去存盘备份。那么这个机制是怎样实现的呢?既然可以回溯历史,那一定得有一个历史备忘类来记录每步操作后的文本状态记录了,它同样是一个简单的Java Bean。

1public class History { 2 private String body;//用于备忘文章内容 3 4 public History(String body){ 5 this.body = body; 6 } 7 8 public String getBody() { 9 return body; 10 } 11}

有了这个类,我们便可以记录文档的内容快照了,在初始化时把文档内容传进来。那谁来生成这些历史记录呢?我们可以放在文档类里,让文档类具备创建与恢复历史记录的功能,我们对Doc文档类做如下修改。

1public class Doc { 2 private String title;//文章名字 3 private String body;//文章内容 4 5 public Doc(String title){//新建文档先命名 6 this.title = title; 7 this.body = ""; 8 } 9 10 public void setTitle(String title) { 11 this.title = title; 12 } 13 14 public String getTitle() { 15 return title; 16 } 17 18 public String getBody() { 19 return body; 20 } 21 22 public void setBody(String body) { 23 this.body = body; 24 } 25 26 public History createHistory() { 27 return new History(body);//创建历史记录 28 } 29 30 public void restoreHistory(History history){ 31 this.body = history.getBody();//恢复历史记录 32 } 33}

 可以看到自第26行开始我们加入了这两个功能,只要简单的调用,便可以生成当下的历史记录,以及来去自如的恢复内容到任一历史时刻。接下来得有对历史记录的逻辑控制,也就是我们期待已久的撤销功能了,继续对编辑器类做如下修改。

1public class Editor { 2 private Doc doc; 3 private List<History> historyRecords;// 历史记录列表 4 private int historyPosition = -1;// 历史记录当前位置 5 6 public Editor(Doc doc) { 7 System.out.println("<<<打开文档" + doc.getTitle()); 8 this.doc = doc; // 注入文档 9 historyRecords = new ArrayList<>();// 初始化历史记录 10 backup();// 保存一份历史记录 11 show();//显示内容 12 } 13 14 public void append(String txt) { 15 System.out.println("<<<插入操作"); 16 doc.setBody(doc.getBody() + txt); 17 backup();//操作完成后保存历史记录 18 show(); 19 } 20 21 public void save(){ 22 System.out.println("<<<存盘操作"); 23 } 24 25 public void delete(){ 26 System.out.println("<<<删除操作"); 27 doc.setBody(""); 28 backup();//操作完成后保存历史记录 29 show(); 30 } 31 32 private void backup() { 33 historyRecords.add(doc.createHistory()); 34 historyPosition++; 35 } 36 37 private void show() {// 显示当前文本内容 38 System.out.println(doc.getBody()); 39 System.out.println("文章结束>>>\n"); 40 } 41 42 public void undo() {// 撤销操作:如按下Ctr+Z,回到过去。 43 System.out.println(">>>撤销操作"); 44 if (historyPosition == 0) { 45 return;//到头了,不能再撤销了。 46 } 47 historyPosition--;//历史记录位置回滚一笔 48 History history = historyRecords.get(historyPosition); 49 doc.restoreHistory(history);//取出历史记录并恢复至文档 50 show(); 51 } 52 53 // public void redo(); 省略实现代码 54}

在第3行我们加入了一个历史记录列表,它就像是时间轴一样按顺序地按index记录每个时间点的历史事件,从某种意义上看它更像是一本历史书。接下来加入的第32行backup方法会从文档中拿出快照并插入历史书,并于每个暴露给客户端作者的操作方法内被调用,做好历史的传承。最后我们加入第42行的撤销操作,让时间点回溯一个单位并恢复此处的快照至文档。当编辑器拥有了撤销功能后,我们的鬼才作者将高枕无忧的去倒咖啡了。

1public class Author { 2 public static void main(String[] args) { 3 Editor editor = new Editor(new Doc("《AI的觉醒》")); 4 /* 5 <<<打开文档《AI的觉醒》 6 7 文章结束>>> 8 */ 9 editor.append("第一章 混沌初开"); 10 /* 11 <<<插入操作 12 第一章 混沌初开 13 文章结束>>> 14 */ 15 editor.append("\n 正文2000字……"); 16 /* 17 <<<插入操作 18 第一章 混沌初开 19 正文2000字…… 20 文章结束>>> 21 */ 22 editor.append("\n第二章 荒漠之花\n 正文3000字……"); 23 /* 24 <<<插入操作 25 第一章 混沌初开 26 正文2000字…… 27 第二章 荒漠之花 28 正文3000字…… 29 文章结束>>> 30 */ 31 editor.delete(); 32 /* 33 <<<删除操作 34 35 文章结束>>> 36 */ 37 38 //吃下后悔药,我的世界又完整了。 39 editor.undo(); 40 /* 41 >>>撤销操作 42 第一章 混沌初开 43 正文2000字…… 44 第二章 荒漠之花 45 正文3000字…… 46 文章结束>>> 47 */ 48 } 49}

可以看到,熊孩子做了delete操作后,作者轻松淡定地按下了Ctr+z,一切恢复如初,世界依旧美好,挽回那逝去的青葱岁月。当然,代码中我们略去了一些功能,比如读者还可以加入重做redo操作,弹指之间,让历史在时间轴上来去自如,我的电脑我做主,时空穿梭,逆天之做。

诚然,任何模式都有其优缺点,备忘录虽然看起来完美,但如果历史状态内容过大,会导致内存消耗严重,别忘了那边历史书的list是在内存中的哦,所以我们一定要依场景灵活运用,切不可生搬硬套。


 

 

 

 

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/21868.html

    分享给朋友:

    “我的世界java备份在那个文件夹 我的世界java版备份” 的相关文章

    中国电信CN2网络连接不上?解密问题根源与高效解决方案

    在如今这个信息化高度发达的时代,网络已经成为我们生活中不可或缺的一部分。无论是工作、学习还是娱乐,稳定的网络连接都是基础保障。有时候我们可能会遇到网络连接不上或网络速度异常的问题,尤其是使用中国电信CN2网络的用户。如果您正在为“中国电信CN2网络连接不上”而烦恼,那么这篇文章将为您详细解析问题根源...

    CN2 GIA是什么?探索高效国际网络连接的解决方案

    在当今这个数字化时代,网络连接的稳定性与速度成为了企业和个人活动的重中之重。CN2 GIA,或称为全球互联网接入(Global Internet Access),是由中国电信提供的一项高级国际专线网络服务。这项服务在CN2产品线中占据了顶级位置,专为那些需要快速且稳定的国际网络连接的用户而设计。通过...

    JustHost优惠码大揭秘:节省开支的绝佳办法

    JustHost概述 我对JustHost的了解始于它的多样化主机产品和用户友好的服务。JustHost成立于2006年,作为一家俄罗斯主机商,它提供虚拟主机、VPS服务器以及独立服务器,是一个值得关注的选择。JustHost不仅拥有丰富的技术背景,还致力于为用户提供高性价比的服务,这让我对它充满了...

    甲骨文云免费套餐与ARM CPU优势解析

    甲骨文云(Oracle Cloud)是一个强大的云服务平台,近年来受到了越来越多用户的关注。我自己也曾经探索过这个平台,在这里我想和大家聊聊甲骨文云的免费套餐,这对中小企业以及开发者来说真的是一个不错的选择。免费的套餐不仅简化了入门程序,也为新用户提供了足够的资源来尝试不同的云服务。 甲骨文云的免费...

    LightLayer云服务器评测与应用案例分析

    在我日常工作中,云服务器的选择至关重要,而我最近了解到的LightLayer云服务器,给我留下了深刻的印象。作为Megalayer旗下的品牌,LightLayer在全球多个重要地点部署了服务器,尤其是在美国洛杉矶、中国台湾台北和菲律宾马尼拉。这些选择不仅为用户提供了更快速的访问速度,也为他们的云计算...

    注册域名的全面指南:选择合适域名的重要性和流程

    在当今数字化的时代,注册域名对企业和个人来说都是至关重要的。域名不仅是一个网站的名字,更是一个在网络空间中的唯一标识符。它能帮助用户快速记住你的品牌,提升他们对你的信任度。如果没有一个合适的域名,用户可能会在茫茫互联网中迷失方向,导致潜在客户流失。 我个人在选择域名时,充分意识到其独特的价值。一个好...