基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
设计模式是什么鬼(备忘录)
设计模式是什么鬼(备忘录)
阅读
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
&
lt
;&
lt
;&
lt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
20
%
0A36
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
*/%
0A37
%
20
%
20
%
20
%
20
%
7D
%
0A38
%
7D
%
0A
鬼才作者开始了创作,一切进行地非常顺利,一气呵成写完了二章内容(第
22
行操作),于是他离开电脑去倒了杯咖啡,噩耗在此间发生了,他的熊孩子不知怎么就按下了
Ctr
A
,
Delete
触发了第
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
&
lt
;
History
&
gt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
lt
;&
gt
;();//%
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
&
lt
;&
lt
;&
lt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
gt
;&
gt
;&
gt
;%
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
记录每个时间点的历史事件,从某种意义上看它更像是一本历史书。接下来加入的第
32
行
backup
方法会从文档中拿出快照并插入历史书,并于每个暴露给客户端作者的操作方法内被调用,做好历史的传承。最后我们加入第
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
lt
;&
lt
;&
lt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
gt
;&
gt
;&
gt
;%
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
&
gt
;&
gt
;&
gt
;%
0A47
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
*/%
0A48
%
20
%
20
%
20
%
20
%
7D
%
0A49
%
7D
可以看到,熊孩子做了
delete
操作后,作者轻松淡定地按下了
Ctr
z
,一切恢复如初,世界依旧美好,挽回那逝去的青葱岁月。当然,代码中我们略去了一些功能,比如读者还可以加入重做
redo
操作,弹指之间,让历史在时间轴上来去自如,我的电脑我做主,时空穿梭,逆天之做。
诚然,任何模式都有其优缺点,备忘录虽然看起来完美,但如果历史状态内容过大,会导致内存消耗严重,别忘了那边历史书的
list
是在内存中的哦,所以我们一定要依场景灵活运用,切不可生搬硬套。
点击图片加入
Java
知音交流群
↓↓↓
看完本文有收获?请转发分享给更多人
以上数据来源于网络,如有侵权,请联系删除。
上一篇:
100%会用到的hashCode()和equals()方法及使用规范,你掌握了吗?
下一篇:
设计模式是什么鬼(迭代器)
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目