Образец памятного подарка — все о государстве. Вы используете его, когда хотите восстановить объект в прежнее состояние. У вас есть объект, вы применяете некоторые действия, и вы можете отменить эти действия и получить объект в различных состояниях, в которых он был раньше.
Большинство из нас реализуют различные алгоритмы, и иногда нам нужно оценивать их. Представьте себе, что у вас есть программа, которая оценивает торговые решения, и вы хотите перейти в предыдущее состояние и проверить, что произойдет с балансом счета, если вы измените формулу, а затем оценить баланс счета для каждого шага.
Шаги алгоритма и то, что вы должны изменить, определенно будут отличаться. Шаблон памяти поможет нам в нашей миссии и поможет нам быстро оценить память.
У нас будет объект Memento, который содержит остаток на счете. Memento будет представлять баланс на разных этапах.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
package com.gkatzioura.design.behavioural.memento;public class Memento { private Double balance; public Memento(Double balance) { this.balance = balance; } public Double getBalance() { return balance; }} |
Затем мы создадим объект-источник. Отправитель будет содержать текущее состояние. Он может передать его обратно в качестве памятки, когда нам нужно его сохранить. Также мы можем использовать объект памятки, чтобы восстановить определенное состояние.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package com.gkatzioura.design.behavioural.memento;public class Originator { private Double balance; public void setBalance(Double balance) { this.balance = balance; } public Double getBalance() { return balance; } public Memento saveToMemento() { return new Memento(balance); } public void restoreToState(Memento memento) { balance = memento.getBalance(); }} |
Последний шаг — это объект CareTaker, он будет содержать историю нашего баланса. Смотритель будет получать состояние объекта во время их различных фаз.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
package com.gkatzioura.design.behavioural.memento;import java.util.ArrayList;import java.util.List;public class CareTaker { private List mementoList = new ArrayList(); public void add(Memento state){ mementoList.add(state); } public Memento get(int index){ return mementoList.get(index); }} |
Итак, давайте соединим их все вместе.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
package com.gkatzioura.design.behavioural.memento;public class MementoMain { public static void main(String[] args) { Double balance = 20.1d; Originator originator = new Originator(); originator.setBalance(balance); CareTaker careTaker = new CareTaker(); careTaker.add(originator.saveToMemento()); /** * Do a transaction */ originator.setBalance(balance-2); careTaker.add(originator.saveToMemento()); /** * Do a transaction */ originator.setBalance(balance+4); careTaker.add(originator.saveToMemento()); System.out.println(careTaker.get(0).getBalance()); System.out.println(careTaker.get(1).getBalance()); System.out.println(careTaker.get(2).getBalance()); }} |
Вы можете найти исходный код на github .
| Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Поведенческие шаблоны дизайна: Memento
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |