Статьи

Поведенческий дизайн моделей: сувенир

Образец памятного подарка — все о государстве. Вы используете его, когда хотите восстановить объект в прежнее состояние. У вас есть объект, вы применяете некоторые действия, и вы можете отменить эти действия и получить объект в различных состояниях, в которых он был раньше.

Большинство из нас реализуют различные алгоритмы, и иногда нам нужно оценивать их. Представьте себе, что у вас есть программа, которая оценивает торговые решения, и вы хотите перейти в предыдущее состояние и проверить, что произойдет с балансом счета, если вы измените формулу, а затем оценить баланс счета для каждого шага.

Шаги алгоритма и то, что вы должны изменить, определенно будут отличаться. Шаблон памяти поможет нам в нашей миссии и поможет нам быстро оценить память.

У нас будет объект 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, являются их собственными.