Skip to content

Commit f5b1101

Browse files
committed
备忘录模式在文本编辑器中的应用
1 parent 5cc7f36 commit f5b1101

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
packagecom.anxpp.designpattern.memento.textEditor;
2+
3+
importjava.util.LinkedList;
4+
5+
//文本编辑器
6+
publicclassTextEditor{
7+
publicstaticvoidmain(String[] args){
8+
//使用这个文本编辑器
9+
MyTextEditoreditor = newMyTextEditor("这里是初始文本,可能为文件中读取的值。");
10+
System.out.println("开始修改文本:");
11+
editor.append("添加文字1");
12+
editor.delWords(); //删除最后一个
13+
// editor.delWords(2); //删除最后2个 这两个方法是没有问题的,这里避免控制台输出太多,取消这两次修改
14+
// editor.delWords(1,5); //删除前面5个
15+
System.out.println("开始恢复:");
16+
for(inti=0;i<10;i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态
17+
System.out.println("开始重做:");
18+
for(inti=0;i<10;i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态
19+
System.out.println("再次恢复:");
20+
for(inti=0;i<10;i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态
21+
System.out.println("再次重做:");
22+
for(inti=0;i<10;i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态
23+
System.out.println("再次恢复:");
24+
for(inti=0;i<10;i++) editor.recoverMemento();//恢复大于实际修改的次数不会出错,只会将文本设为o初始化状态
25+
editor.append("添加文字2");
26+
System.out.println("再次重做:");
27+
for(inti=0;i<10;i++) editor.redo(); //重做大于实际恢复的次数不会出错,只会将文本设为最后状态
28+
}
29+
}
30+
interfaceIMemento{}
31+
//发起人兼负责人
32+
classMyTextEditor{
33+
publicStringBuffertext;
34+
privateLinkedList<IMemento> mementos; //保存快照
35+
privateLinkedList<IMemento> undos; //保存撤销的操作
36+
publicMyTextEditor(){
37+
this("");
38+
}
39+
publicMyTextEditor(StringdefaultStr){
40+
text = newStringBuffer(defaultStr);
41+
mementos = newLinkedList<IMemento>();
42+
undos = newLinkedList<IMemento>();
43+
print();
44+
}
45+
publicvoidclearHistory(){
46+
mementos.clear();
47+
undos.clear();
48+
}
49+
publicvoidappend(StringappendStr){
50+
if(appendStr==null||appendStr.length()==0) return;
51+
createMemento();
52+
text.append(appendStr);
53+
print();
54+
undos.clear();
55+
}
56+
//删除最后一个
57+
publicvoiddelWords(){
58+
delWords(1);
59+
}
60+
//删除最后n个
61+
publicvoiddelWords(intn){
62+
if(n<1||n>text.length()) return;
63+
delWords(text.length()-n+1,text.length());
64+
}
65+
//删除中间start到end的字符,第一个文字为第一个(而不是0)
66+
publicvoiddelWords(intstart,intend){
67+
if(start<1 || end>text.length()+1) return;
68+
createMemento();
69+
text = text.delete(start-1, end);
70+
print();
71+
}
72+
publicvoidreset(Stringtext){
73+
this.text = newStringBuffer(text);
74+
}
75+
//新的快照
76+
publicvoidcreateMemento(){
77+
mementos.push(newMemento(this));
78+
}
79+
//恢复状态
80+
publicbooleanrecoverMemento(){
81+
Mementomemento = (Memento) mementos.poll();
82+
if(memento==null) returnfalse;
83+
undos.push(newMemento(this));
84+
reset(memento.state);
85+
print();
86+
returntrue;
87+
}
88+
//redo,redo的操作也可以恢复!
89+
publicbooleanredo(){
90+
Mementomemento = (Memento) undos.poll();
91+
if(memento==null) returnfalse;
92+
createMemento();
93+
reset(memento.state);
94+
print();
95+
returntrue;
96+
}
97+
//内部类实现备忘录
98+
privateclassMementoimplementsIMemento{
99+
privateStringstate;
100+
privateMemento(MyTextEditoreditor){
101+
this.state = editor.text.toString();
102+
}
103+
}
104+
voidprint(){
105+
System.out.println("当前文本:" + text);
106+
}
107+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/**
2+
* @author Administrator
3+
* 备忘录模式的应用
4+
*/
5+
packagecom.anxpp.designpattern.memento.textEditor;

0 commit comments

Comments
(0)