Memento

Memento ํŒจํ„ด์€ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์ €์žฅ(์Šค๋ƒ…์ƒท)ํ•ด๋‘์—ˆ๋‹ค๊ฐ€, ํ•„์š”ํ•  ๋•Œ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์บก์Аํ™”ํ•˜์—ฌ ๋ณด์กดํ•˜๊ณ , ๋‚˜์ค‘์— ์›๋ž˜ ์ƒํƒœ๋กœ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

plaintext๋ณต์‚ฌ       +---------------+       ์ €์žฅ/๋ณต์›       +---------------+
       |   Originator  | -------------------> |   Memento     |
       | (์ƒํƒœ ๊ด€๋ฆฌ ๊ฐ์ฒด)| <------------------- | (์ƒํƒœ ์บก์Аํ™”)  |
       +---------------+                       +---------------+
               โ”‚                                       โ–ฒ
               โ”‚                                       โ”‚
               โ”‚                                       โ”‚
               โ–ผ                                       โ”‚
       +---------------+                               โ”‚
       |   Caretaker   | ------------------------------โ”˜
       | (๋ณด๊ด€์ž ์—ญํ• ) |
       +---------------+
  • Originator: ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ์ƒ์„ฑ, ์ €์žฅ, ๋ณต์›ํ•  ์ฑ…์ž„์ด ์žˆ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

  • Memento: Originator์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์บก์Аํ™”ํ•œ ๊ฐ์ฒด๋กœ, ์™ธ๋ถ€์—๋Š” ์ƒํƒœ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ๋‚ด์šฉ์ด ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • Caretaker: Memento ๊ฐ์ฒด๋ฅผ ๋ณด๊ด€ํ•˜๋ฉฐ, ํ•„์š”ํ•  ๋•Œ Originator์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ ์ƒํƒœ ๋ณต์›์„ ์š”์ฒญํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


How do code?

// Memento: Originator์˜ ์ƒํƒœ๋ฅผ ์บก์Аํ™” (๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ)
public class Memento {
    private final String state;

    public Memento(String state) {
        this.state = state;
    }

    // ์ƒํƒœ ์ •๋ณด๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ์™ธ๋ถ€์— ๊ณต๊ฐœ๋˜์ง€ ์•Š์Œ
    protected String getState() {
        return state;
    }
}

// Originator: ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋Š” ์—ญํ• 
public class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
        System.out.println("Originator ์ƒํƒœ ๋ณ€๊ฒฝ: " + state);
    }

    public String getState() {
        return state;
    }

    // ํ˜„์žฌ ์ƒํƒœ๋ฅผ Memento์— ์ €์žฅํ•˜์—ฌ ๋ฐ˜ํ™˜
    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    // Memento๋ฅผ ์ด์šฉํ•ด ์ƒํƒœ ๋ณต์›
    public void getStateFromMemento(Memento memento) {
        this.state = memento.getState();
        System.out.println("Originator ์ƒํƒœ ๋ณต์›: " + state);
    }
}

// Caretaker: Memento๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ์—ญํ• 
public class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();

    public void add(Memento state){
        mementoList.add(state);
    }

    public Memento get(int index){
        return mementoList.get(index);
    }
}
  • ์ƒํƒœ ์ €์žฅ: Originator ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ Memento ๊ฐ์ฒด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ Caretaker๊ฐ€ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒํƒœ ๋ณต์›: ์ €์žฅ๋œ Memento ๊ฐ์ฒด๋ฅผ Originator์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ, ์ด์ „ ์ƒํƒœ๋กœ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์žฅ์ : ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋ณด์กดํ•˜๋ฉฐ, ์–ธ์ œ๋“ ์ง€ ํŠน์ • ์‹œ์ ์˜ ์ƒํƒœ๋กœ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ž‘์—… ์ทจ์†Œ(undo) ๊ธฐ๋Šฅ์ด๋‚˜ ์Šค๋ƒ…์ƒท ๊ด€๋ฆฌ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Last updated