当前位置:首页>编程知识库>后端开发知识>设计模式是什么鬼(备忘录)
设计模式是什么鬼(备忘录)
阅读 1
2018-10-29
备忘录,备份曾经发生过的历史记录,以防忘记,之后便可以轻松回溯过往。想必我们曾经都干过很多蠢事导致糟糕的结果,当后悔莫及的时候已经是覆水难收了,只可惜这世界上没有后悔药,事后我们能做的只能去弥补过失,总结经验。除非穿越时空,时光倒流,利用爱因斯坦狭义相对论,超越光速回到过去,破镜重圆。
然而世界是残酷的,人类至今最快的载人交通工具连达到光速的万分之一都显得遥不可及,更别说超越了。光速,宇宙间永远无法打破的时空屏障,它像是上帝定义的常量C,将时间牢牢地套死在坐标轴上,自创世宇宙大爆炸开始就让它不断流逝,如同播放一部不可回退的电影一样,暮去朝来,谁也无法打破。
但在计算机世界里,人类便是神一般的存在,各种回滚,倒退,载入历史显得稀松平常,例如数据库恢复、游戏存盘载入、操作系统快照恢复、打开备份文档、手机恢复出厂设置……为了保证极简风格,我们这里以文档操作来举例说明这个设计模式。
假设某位作者要写一部科幻小说,当他打开编辑器软件以及创建文档开始创作的时候,我们来思考下这个场景需要哪些类。很简单,首先我们得有一个文档类Doc
%201public%20class%20Doc%20%7B%0A%202%20%20%20%20private%20String%20title;//%E6%96%87%E7%AB%A0%E6%A0%87%E9%A2%98%0A%203%20%20%20%20private%20String%20body;//%E6%96%87%E7%AB%A0%E5%86%85%E5%AE%B9%0A%204%0A%205%20%20%20%20public%20Doc(String%20title)%7B//%E6%96%B0%E5%BB%BA%E6%96%87%E6%A1%A3%E5%85%88%E5%91%BD%E5%90%8D%0A%206%20%20%20%20%20%20%20%20this.title%20=%20title;%0A%207%20%20%20%20%20%20%20%20this.body%20=%20%22%22;%0A%208%20%20%20%20%7D%0A%209%0A10%20%20%20%20public%20void%20setTitle(String%20title)%20%7B%0A11%20%20%20%20%20%20%20%20this.title%20=%20title;%0A12%20%20%20%20%7D%0A13%0A14%20%20%20%20public%20String%20getTitle()%20%7B%0A15%20%20%20%20%20%20%20%20return%20title;%0A16%20%20%20%20%7D%0A17%0A18%20%20%20%20public%20String%20getBody()%20%7B%0A19%20%20%20%20%20%20%20%20return%20body;%0A20%20%20%20%20%7D%0A21%0A22%20%20%20%20public%20void%20setBody(String%20body)%20%7B%0A23%20%20%20%20%20%20%20%20this.body%20=%20body;%0A24%20%20%20%20%7D%0A25%7D%0A
没什么好说的,一个简单的Java Bean,包括标题与内容。有了文档那一定要有编辑器去修改它了,看代码。
%201public%20class%20Editor%20%7B//%E7%BC%96%E8%BE%91%E5%99%A8%0A%202%20%20%20%20private%20Doc%20doc;//%E6%96%87%E6%A1%A3%E5%BC%95%E7%94%A8%0A%203%0A%204%20%20%20%20public%20Editor(Doc%20doc)%20%7B%0A%205%20%20%20%20%20%20%20%20System.out.println(%22<<<%E6%89%93%E5%BC%80%E6%96%87%E6%A1%A3%22%20 %20doc.getTitle());%0A%206%20%20%20%20%20%20%20%20this.doc%20=%20doc;%0A%207%20%20%20%20%20%20%20%20show();%0A%208%20%20%20%20%7D%0A%209%0A10%20%20%20%20public%20void%20append(String%20txt)%20%7B%0A11%20%20%20%20%20%20%20%20System.out.println(%22<<<%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C%22);%0A12%20%20%20%20%20%20%20%20doc.setBody(doc.getBody()%20 %20txt);%0A13%20%20%20%20%20%20%20%20show();%0A14%20%20%20%20%7D%0A15%0A16%20%20%20%20public%20void%20save()%7B%0A17%20%20%20%20%20%20%20%20System.out.println(%22<<<%E5%AD%98%E7%9B%98%E6%93%8D%E4%BD%9C%22);%0A18%20%20%20%20%7D%0A19%0A20%20%20%20%20public%20void%20delete()%7B%0A21%20%20%20%20%20%20%20%20System.out.println(%22<<<%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C%22);%0A22%20%20%20%20%20%20%20%20doc.setBody(%22%22);%0A23%20%20%20%20%20%20%20%20show();%0A24%20%20%20%20%7D%0A25%0A26%20%20%20%20private%20void%20show()%7B//%E6%98%BE%E7%A4%BA%E5%BD%93%E5%89%8D%E6%96%87%E6%9C%AC%E5%86%85%E5%AE%B9%0A27%20%20%20%20%20%20%20%20System.out.println(doc.getBody());%0A28%20%20%20%20%20%20%20%20System.out.println(%22%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%5Cn%22);%0A29%20%20%20%20%7D%0A30%7D%0A
当编辑器打开一个文档后会持有其引用,这里我们写在编辑器构造方法里。编辑器主要的功能当然是对文档进行更改了,依然保持简单的操作模拟,我们只加入append插入功能、delete清空功能,以及save存盘方法和最后的show方法用于显示文档内容。一切就绪,接下来看看我们的作者怎样写出一部惊世骇俗的科幻小说《AI的觉醒》。
%201public%20class%20Author%20%7B%0A%202%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%203%20%20%20%20%20%20%20%20Editor%20editor%20=%20new%20Editor(new%20Doc(%22%E3%80%8AAI%E7%9A%84%E8%A7%89%E9%86%92%E3%80%8B%22));%0A%204%20%20%20%20%20%20%20%20/*%0A%205%20%20%20%20%20%20%20%20<<<%E6%89%93%E5%BC%80%E6%96%87%E6%A1%A3%E3%80%8AAI%E7%9A%84%E8%A7%89%E9%86%92%E3%80%8B%0A%206%0A%207%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%0A%208%20%20%20%20%20%20%20%20*/%0A%209%20%20%20%20%20%20%20%20editor.append(%22%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E6%B7%B7%E6%B2%8C%E5%88%9D%E5%BC%80%22);%0A10%20%20%20%20%20%20%20%20/*%0A11%20%20%20%20%20%20%20%20<<<%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C%0A12%20%20%20%20%20%20%20%20%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E6%B7%B7%E6%B2%8C%E5%88%9D%E5%BC%80%0A13%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%0A14%20%20%20%20%20%20%20%20*/%0A15%20%20%20%20%20%20%20%20editor.append(%22%5Cn%20%20%E6%AD%A3%E6%96%872000%E5%AD%97%E2%80%A6%E2%80%A6%22);%0A16%20%20%20%20%20%20%20%20/*%0A17%20%20%20%20%20%20%20%20<<<%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C%0A18%20%20%20%20%20%20%20%20%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E6%B7%B7%E6%B2%8C%E5%88%9D%E5%BC%80%0A19%20%20%20%20%20%20%20%20%20%20%E6%AD%A3%E6%96%872000%E5%AD%97%E2%80%A6%E2%80%A6%0A20%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%0A21%20%20%20%20%20%20%20%20*/%0A22%20%20%20%20%20%20%20%20editor.append(%22%5Cn%E7%AC%AC%E4%BA%8C%E7%AB%A0%20%E8%8D%92%E6%BC%A0%E4%B9%8B%E8%8A%B1%5Cn%20%20%E6%AD%A3%E6%96%873000%E5%AD%97%E2%80%A6%E2%80%A6%22);%0A23%20%20%20%20%20%20%20%20/*%0A24%20%20%20%20%20%20%20%20<<<%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C%0A25%20%20%20%20%20%20%20%20%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E6%B7%B7%E6%B2%8C%E5%88%9D%E5%BC%80%0A26%20%20%20%20%20%20%20%20%20%20%E6%AD%A3%E6%96%872000%E5%AD%97%E2%80%A6%E2%80%A6%0A27%20%20%20%20%20%20%20%20%E7%AC%AC%E4%BA%8C%E7%AB%A0%20%E8%8D%92%E6%BC%A0%E4%B9%8B%E8%8A%B1%0A28%20%20%20%20%20%20%20%20%20%20%E6%AD%A3%E6%96%873000%E5%AD%97%E2%80%A6%E2%80%A6%0A29%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%0A30%20%20%20%20%20%20%20%20*/%0A31%20%20%20%20%20%20%20%20editor.delete();%0A32%20%20%20%20%20%20%20%20/*%0A33%20%20%20%20%20%20%20%20<<<%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C%0A34%0A35%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%20%0A36%20%20%20%20%20%20%20%20*/%0A37%20%20%20%20%7D%0A38%7D%0A
鬼才作者开始了创作,一切进行地非常顺利,一气呵成写完了二章内容(第22行操作),于是他离开电脑去倒了杯咖啡,噩耗在此间发生了,他的熊孩子不知怎么就按下了Ctr ADelete触发了第31行的操作,导致全文丢失,从内存里被清空,而且离开前作者疏忽大意也没有进行存盘操作,这下彻底完了,5000字的心血付诸东流。
此场景该如何是好?大家都想到了Ctr z的操作吧?它可以瞬间撤销上一步操作并回退到前一个版本,不但让我们有吃后悔药的机会,而且还不需要频繁的去存盘备份。那么这个机制是怎样实现的呢?既然可以回溯历史,那一定得有一个历史备忘类来记录每步操作后的文本状态记录了,它同样是一个简单的Java Bean
%201public%20class%20History%20%7B%0A%202%20%20%20%20private%20String%20body;//%E7%94%A8%E4%BA%8E%E5%A4%87%E5%BF%98%E6%96%87%E7%AB%A0%E5%86%85%E5%AE%B9%0A%203%0A%204%20%20%20%20public%20History(String%20body)%7B%0A%205%20%20%20%20%20%20%20%20this.body%20=%20body;%0A%206%20%20%20%20%7D%0A%207%0A%208%20%20%20%20public%20String%20getBody()%20%7B%0A%209%20%20%20%20%20%20%20%20return%20body;%0A10%20%20%20%20%7D%0A11%7D%0A
有了这个类,我们便可以记录文档的内容快照了,在初始化时把文档内容传进来。那谁来生成这些历史记录呢?我们可以放在文档类里,让文档类具备创建与恢复历史记录的功能,我们对Doc文档类做如下修改。
%201public%20class%20Doc%20%7B%0A%202%20%20%20%20private%20String%20title;//%E6%96%87%E7%AB%A0%E5%90%8D%E5%AD%97%0A%203%20%20%20%20private%20String%20body;//%E6%96%87%E7%AB%A0%E5%86%85%E5%AE%B9%0A%204%0A%205%20%20%20%20public%20Doc(String%20title)%7B//%E6%96%B0%E5%BB%BA%E6%96%87%E6%A1%A3%E5%85%88%E5%91%BD%E5%90%8D%0A%206%20%20%20%20%20%20%20%20this.title%20=%20title;%0A%207%20%20%20%20%20%20%20%20this.body%20=%20%22%22;%0A%208%20%20%20%20%7D%0A%209%0A10%20%20%20%20public%20void%20setTitle(String%20title)%20%7B%0A11%20%20%20%20%20%20%20%20this.title%20=%20title;%0A12%20%20%20%20%7D%0A13%0A14%20%20%20%20public%20String%20getTitle()%20%7B%0A15%20%20%20%20%20%20%20%20return%20title;%0A16%20%20%20%20%7D%0A17%0A18%20%20%20%20public%20String%20getBody()%20%7B%0A19%20%20%20%20%20%20%20%20return%20body;%0A20%20%20%20%20%7D%0A21%0A22%20%20%20%20public%20void%20setBody(String%20body)%20%7B%0A23%20%20%20%20%20%20%20%20this.body%20=%20body;%0A24%20%20%20%20%7D%0A25%0A26%20%20%20%20public%20History%20createHistory()%20%7B%0A27%20%20%20%20%20%20%20%20return%20new%20History(body);//%E5%88%9B%E5%BB%BA%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%0A28%20%20%20%20%7D%0A29%0A30%20%20%20%20public%20void%20restoreHistory(History%20history)%7B%0A31%20%20%20%20%20%20%20%20this.body%20=%20history.getBody();//%E6%81%A2%E5%A4%8D%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%0A32%20%20%20%20%7D%0A33%7D%0A
可以看到自第26行开始我们加入了这两个功能,只要简单的调用,便可以生成当下的历史记录,以及来去自如的恢复内容到任一历史时刻。接下来得有对历史记录的逻辑控制,也就是我们期待已久的撤销功能了,继续对编辑器类做如下修改。
%201public%20class%20Editor%20%7B%0A%202%20%20%20%20private%20Doc%20doc;%0A%203%20%20%20%20private%20List<History>%20historyRecords;//%20%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E5%88%97%E8%A1%A8%0A%204%20%20%20%20private%20int%20historyPosition%20=%20-1;//%20%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E5%BD%93%E5%89%8D%E4%BD%8D%E7%BD%AE%0A%205%0A%206%20%20%20%20public%20Editor(Doc%20doc)%20%7B%0A%207%20%20%20%20%20%20%20%20System.out.println(%22<<<%E6%89%93%E5%BC%80%E6%96%87%E6%A1%A3%22%20 %20doc.getTitle());%0A%208%20%20%20%20%20%20%20%20this.doc%20=%20doc;%20//%20%E6%B3%A8%E5%85%A5%E6%96%87%E6%A1%A3%0A%209%20%20%20%20%20%20%20%20historyRecords%20=%20new%20ArrayList<>();//%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%0A10%20%20%20%20%20%20%20%20backup();//%20%E4%BF%9D%E5%AD%98%E4%B8%80%E4%BB%BD%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%0A11%20%20%20%20%20%20%20%20show();//%E6%98%BE%E7%A4%BA%E5%86%85%E5%AE%B9%0A12%20%20%20%20%7D%0A13%0A14%20%20%20%20public%20void%20append(String%20txt)%20%7B%0A15%20%20%20%20%20%20%20%20System.out.println(%22<<<%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C%22);%0A16%20%20%20%20%20%20%20%20doc.setBody(doc.getBody()%20 %20txt);%0A17%20%20%20%20%20%20%20%20backup();//%E6%93%8D%E4%BD%9C%E5%AE%8C%E6%88%90%E5%90%8E%E4%BF%9D%E5%AD%98%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%0A18%20%20%20%20%20%20%20%20show();%0A19%20%20%20%20%7D%0A20%0A21%20%20%20%20public%20void%20save()%7B%0A22%20%20%20%20%20%20%20%20System.out.println(%22<<<%E5%AD%98%E7%9B%98%E6%93%8D%E4%BD%9C%22);%0A23%20%20%20%20%7D%0A24%0A25%20%20%20%20public%20void%20delete()%7B%0A26%20%20%20%20%20%20%20%20System.out.println(%22<<<%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C%22);%0A27%20%20%20%20%20%20%20%20doc.setBody(%22%22);%0A28%20%20%20%20%20%20%20%20backup();//%E6%93%8D%E4%BD%9C%E5%AE%8C%E6%88%90%E5%90%8E%E4%BF%9D%E5%AD%98%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%0A29%20%20%20%20%20%20%20%20show();%0A30%20%20%20%20%7D%0A31%0A32%20%20%20%20private%20void%20backup()%20%7B%0A33%20%20%20%20%20%20%20%20historyRecords.add(doc.createHistory());%0A34%20%20%20%20%20%20%20%20historyPosition ;%0A35%20%20%20%20%7D%0A36%0A37%20%20%20%20private%20void%20show()%20%7B//%20%E6%98%BE%E7%A4%BA%E5%BD%93%E5%89%8D%E6%96%87%E6%9C%AC%E5%86%85%E5%AE%B9%0A38%20%20%20%20%20%20%20%20System.out.println(doc.getBody());%0A39%20%20%20%20%20%20%20%20System.out.println(%22%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%5Cn%22);%0A40%20%20%20%20%7D%0A41%0A42%20%20%20%20public%20void%20undo()%20%7B//%20%E6%92%A4%E9%94%80%E6%93%8D%E4%BD%9C%EF%BC%9A%E5%A6%82%E6%8C%89%E4%B8%8BCtr Z%EF%BC%8C%E5%9B%9E%E5%88%B0%E8%BF%87%E5%8E%BB%E3%80%82%0A43%20%20%20%20%20%20%20%20System.out.println(%22>>>%E6%92%A4%E9%94%80%E6%93%8D%E4%BD%9C%22);%0A44%20%20%20%20%20%20%20%20if%20(historyPosition%20==%200)%20%7B%0A45%20%20%20%20%20%20%20%20%20%20%20%20return;//%E5%88%B0%E5%A4%B4%E4%BA%86%EF%BC%8C%E4%B8%8D%E8%83%BD%E5%86%8D%E6%92%A4%E9%94%80%E4%BA%86%E3%80%82%0A46%20%20%20%20%20%20%20%20%7D%0A47%20%20%20%20%20%20%20%20historyPosition--;//%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E4%BD%8D%E7%BD%AE%E5%9B%9E%E6%BB%9A%E4%B8%80%E7%AC%94%0A48%20%20%20%20%20%20%20%20History%20history%20=%20historyRecords.get(historyPosition);%0A49%20%20%20%20%20%20%20%20doc.restoreHistory(history);//%E5%8F%96%E5%87%BA%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E5%B9%B6%E6%81%A2%E5%A4%8D%E8%87%B3%E6%96%87%E6%A1%A3%0A50%20%20%20%20%20%20%20%20show();%0A51%20%20%20%20%7D%0A52%0A53%20%20%20%20//%20public%20void%20redo();%20%E7%9C%81%E7%95%A5%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%A0%81%0A54%7D%0A
在第3行我们加入了一个历史记录列表,它就像是时间轴一样按顺序地按index记录每个时间点的历史事件,从某种意义上看它更像是一本历史书。接下来加入的第32backup方法会从文档中拿出快照并插入历史书,并于每个暴露给客户端作者的操作方法内被调用,做好历史的传承。最后我们加入第42行的撤销操作,让时间点回溯一个单位并恢复此处的快照至文档。当编辑器拥有了撤销功能后,我们的鬼才作者将高枕无忧的去倒咖啡了。
%201public%20class%20Author%20%7B%0A%202%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%203%20%20%20%20%20%20%20%20Editor%20editor%20=%20new%20Editor(new%20Doc(%22%E3%80%8AAI%E7%9A%84%E8%A7%89%E9%86%92%E3%80%8B%22));%0A%204%20%20%20%20%20%20%20%20/*%0A%205%20%20%20%20%20%20%20%20<<<%E6%89%93%E5%BC%80%E6%96%87%E6%A1%A3%E3%80%8AAI%E7%9A%84%E8%A7%89%E9%86%92%E3%80%8B%0A%206%0A%207%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%0A%208%20%20%20%20%20%20%20%20*/%0A%209%20%20%20%20%20%20%20%20editor.append(%22%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E6%B7%B7%E6%B2%8C%E5%88%9D%E5%BC%80%22);%0A10%20%20%20%20%20%20%20%20/*%0A11%20%20%20%20%20%20%20%20<<<%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C%0A12%20%20%20%20%20%20%20%20%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E6%B7%B7%E6%B2%8C%E5%88%9D%E5%BC%80%0A13%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%0A14%20%20%20%20%20%20%20%20*/%0A15%20%20%20%20%20%20%20%20editor.append(%22%5Cn%20%20%E6%AD%A3%E6%96%872000%E5%AD%97%E2%80%A6%E2%80%A6%22);%0A16%20%20%20%20%20%20%20%20/*%0A17%20%20%20%20%20%20%20%20<<<%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C%0A18%20%20%20%20%20%20%20%20%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E6%B7%B7%E6%B2%8C%E5%88%9D%E5%BC%80%0A19%20%20%20%20%20%20%20%20%20%20%E6%AD%A3%E6%96%872000%E5%AD%97%E2%80%A6%E2%80%A6%0A20%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%0A21%20%20%20%20%20%20%20%20*/%0A22%20%20%20%20%20%20%20%20editor.append(%22%5Cn%E7%AC%AC%E4%BA%8C%E7%AB%A0%20%E8%8D%92%E6%BC%A0%E4%B9%8B%E8%8A%B1%5Cn%20%20%E6%AD%A3%E6%96%873000%E5%AD%97%E2%80%A6%E2%80%A6%22);%0A23%20%20%20%20%20%20%20%20/*%0A24%20%20%20%20%20%20%20%20<<<%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C%0A25%20%20%20%20%20%20%20%20%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E6%B7%B7%E6%B2%8C%E5%88%9D%E5%BC%80%0A26%20%20%20%20%20%20%20%20%20%20%E6%AD%A3%E6%96%872000%E5%AD%97%E2%80%A6%E2%80%A6%0A27%20%20%20%20%20%20%20%20%E7%AC%AC%E4%BA%8C%E7%AB%A0%20%E8%8D%92%E6%BC%A0%E4%B9%8B%E8%8A%B1%0A28%20%20%20%20%20%20%20%20%20%20%E6%AD%A3%E6%96%873000%E5%AD%97%E2%80%A6%E2%80%A6%0A29%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%0A30%20%20%20%20%20%20%20%20*/%0A31%20%20%20%20%20%20%20%20editor.delete();%0A32%20%20%20%20%20%20%20%20/*%0A33%20%20%20%20%20%20%20%20<<<%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C%0A34%0A35%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%20%0A36%20%20%20%20%20%20%20%20*/%0A37%0A38%20%20%20%20%20%20%20%20//%E5%90%83%E4%B8%8B%E5%90%8E%E6%82%94%E8%8D%AF%EF%BC%8C%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C%E5%8F%88%E5%AE%8C%E6%95%B4%E4%BA%86%E3%80%82%0A39%20%20%20%20%20%20%20%20editor.undo();%0A40%20%20%20%20%20%20%20%20/*%0A41%20%20%20%20%20%20%20%20>>>%E6%92%A4%E9%94%80%E6%93%8D%E4%BD%9C%0A42%20%20%20%20%20%20%20%20%E7%AC%AC%E4%B8%80%E7%AB%A0%20%E6%B7%B7%E6%B2%8C%E5%88%9D%E5%BC%80%0A43%20%20%20%20%20%20%20%20%20%20%E6%AD%A3%E6%96%872000%E5%AD%97%E2%80%A6%E2%80%A6%0A44%20%20%20%20%20%20%20%20%E7%AC%AC%E4%BA%8C%E7%AB%A0%20%E8%8D%92%E6%BC%A0%E4%B9%8B%E8%8A%B1%0A45%20%20%20%20%20%20%20%20%20%20%E6%AD%A3%E6%96%873000%E5%AD%97%E2%80%A6%E2%80%A6%0A46%20%20%20%20%20%20%20%20%E6%96%87%E7%AB%A0%E7%BB%93%E6%9D%9F>>>%0A47%20%20%20%20%20%20%20%20*/%0A48%20%20%20%20%7D%0A49%7D
可以看到,熊孩子做了delete操作后,作者轻松淡定地按下了Ctr z,一切恢复如初,世界依旧美好,挽回那逝去的青葱岁月。当然,代码中我们略去了一些功能,比如读者还可以加入重做redo操作,弹指之间,让历史在时间轴上来去自如,我的电脑我做主,时空穿梭,逆天之做。
诚然,任何模式都有其优缺点,备忘录虽然看起来完美,但如果历史状态内容过大,会导致内存消耗严重,别忘了那边历史书的list是在内存中的哦,所以我们一定要依场景灵活运用,切不可生搬硬套。
点击图片加入Java知音交流群
↓↓↓
看完本文有收获?请转发分享给更多人
以上数据来源于网络,如有侵权,请联系删除。
评论 (0)