Skip to content

Commit dd141ff

Browse files
committed
memento added
1 parent be4eba4 commit dd141ff

File tree

7 files changed

+190
-0
lines changed

7 files changed

+190
-0
lines changed

memento/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# memento
2+
3+
This is repository of http://androidcode.pl blog. It shows uses of Memento in Android. It is a part of Design Patterns - Memento post in the blog.

memento/example/Document.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
public class Document {
2+
3+
private String text;
4+
private String name;
5+
private long timestamp;
6+
7+
public Answer(String name) {
8+
this.name = name;
9+
this.text = "";
10+
this.timestamp = System.currentTimeMillis();
11+
}
12+
13+
public void setText(String text) {
14+
this.text = text;
15+
this.timestamp = System.currentTimeMillis();
16+
}
17+
18+
public void setName(String name) {
19+
this.name = name;
20+
this.timestamp = System.currentTimeMillis();
21+
}
22+
23+
public Memento save() {
24+
return new Memento(name, text, timestamp);
25+
}
26+
27+
public void restore(Memento memento) {
28+
this.name = memento.name;
29+
this.text = memento.text;
30+
this.timestamp = memento.timestamp;
31+
}
32+
33+
class Memento {
34+
35+
private String name;
36+
private String text;
37+
private long timestamp;
38+
39+
public Memento(String name, String text, long timestamp) {
40+
this.name = name;
41+
this.text = text;
42+
this.timestamp = timestamp;
43+
}
44+
45+
public String getText() {
46+
return text;
47+
}
48+
49+
public int getOption() {
50+
return option;
51+
}
52+
}
53+
}

memento/example/DocumentManager.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
public class DocumentManager {
2+
3+
private List<Memento> mementos = new ArrayList<>();
4+
private int current = 0;
5+
6+
public void add(Memento memento) {
7+
mementos.add(memento);
8+
current++;
9+
}
10+
11+
public Memento redo() {
12+
if(current < mementos.size() - 1)
13+
current += 1;
14+
return mementos.get(current);
15+
}
16+
17+
public Memento undo() {
18+
if(current > 0)
19+
current -= 1;
20+
return mementos.get(current);
21+
}
22+
23+
public Memento get(int number) {
24+
if(number >= 0 && number < mementos.size())
25+
return mementos.get(number);
26+
else
27+
return mementos.get(current);
28+
}
29+
30+
public int historySize() {
31+
return mementos.size();
32+
}
33+
}

memento/example/Main.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
public class Main {
2+
3+
public static void main() {
4+
//user open writer editor and create new empty file
5+
DocumentManager manager = new DocumentManager();
6+
Document document = new Document("CV.doc");
7+
8+
//user wrote some text into document
9+
decument.setText("Begin of the text document.");
10+
11+
//user wrote more text
12+
document.setText("Begin of the text document. More text wrote here.");
13+
//autosave executed
14+
manager.add(document.save()); //first document snapshot
15+
16+
//user change document name and wrote more text
17+
document.setName("CV_ENG.doc");
18+
document.setText("Begin of the text document. More text wrote here. And more text again.")
19+
//autosave executed
20+
manager.add(document.save()); //second document snapshot
21+
22+
//user removed whole text and typed new one
23+
document.setText("Text wrote again.");
24+
//manual save executed
25+
manager.add(document.save()); //third document snapshot
26+
27+
//after some while user decide to restore previous document snapshot
28+
document.restore(manager.undo());
29+
30+
//user can write text and undo, redo or choose concrete document snapshot to revert state
31+
}
32+
}

memento/pattern/Caretraker.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
public class Caretaker {
2+
3+
private List<Memento> mementos = new ArrayList<>();
4+
5+
public void add(Memento memento) {
6+
mementos.add(memento);
7+
}
8+
9+
public Memento get(int index) {
10+
return mementos.get(index)
11+
}
12+
13+
public int getSize() {
14+
return mementos.size();
15+
}
16+
}

memento/pattern/Main.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
public class Main {
2+
3+
public static void main() {
4+
Originator originator = new Originator();
5+
Caretaker caretaker = new Caretaker();
6+
7+
//first step, no need to add to the history
8+
originator.setState("State1");
9+
10+
//next step, need to add to the history
11+
originator.setState("State2");
12+
caretaker.add(originator.save()); //State2 has been saved
13+
14+
//next step, also need to save
15+
originator.setState("State3");
16+
caretaker.add(originator.save()); //State3 has been saved
17+
18+
//next step, no need to save
19+
originator.setState("State4");
20+
21+
//user decide to back step so previous state restore
22+
originator.restore(caretaker.get(caretaker.getSize() - 1));
23+
}
24+
}

memento/pattern/Originator.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
public class Originator {
2+
3+
private String state;
4+
5+
public void setState(String state) {
6+
this.state = state;
7+
}
8+
9+
public Memento save() {
10+
return new Memento(state);
11+
}
12+
13+
public void restore(Memento memento) {
14+
state = memento.getState();
15+
}
16+
17+
class Memento {
18+
19+
private String state;
20+
21+
public Memento(String state) {
22+
this.state = state;
23+
}
24+
25+
public String getState() {
26+
return state;
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)