设计模式-行为型-备忘录模式

141 阅读1分钟

简介

备忘录模式是行为型模式模式的一种,其核心就是将对象的状态存储起来,以便在需要的时候恢复。在备忘录模式中,有Memento/Originator/CareTaker,其中Memento包含了对象的状态,Originator在Memento对象中存储状态,CareTaker负责恢复状态。在我们编写word时,经常使用Ctrl+Z和Ctrl+Y来实现redo和undo操作,下面就以这个例子来Demo示例。PS:在真正开发中,一般时使用备忘录模式+命令模式来实现redo和undo的操作。

Demo示例

1.首先定义Memento:

public class Memento {
    private String state;

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

    public String getMementoState() {
        return this.state;
    }
}

2.定义Originator

public class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public Memento save() {
        return new Memento(this.state);
    }
}

3.定义CareTaker,里面实现了undo/redo功能

import java.util.Stack;

public class CareTaker {

    private Stack<Memento> forward = new Stack<>();
    private Stack<Memento> back = new Stack<>();

    public void addMemento(Memento state) {
        back.clear();
        forward.push(state);
    }

    public Memento undo() {
        if (forward.empty()) {
            return new Memento(null);
        }
        if (forward.size() == 1) {
            return forward.peek();
        }
        back.push(forward.pop());
        return forward.peek();
    }

    public Memento redo() {
        if (back.empty()) {
            if (forward.empty()) {
                return new Memento(null);
            }
            return forward.peek();
        }
        forward.push(back.pop());
        return forward.peek();
    }

    public Memento getLastMemento() {
        return forward.lastElement();
    }
}

4.客户端测试调用

public class Test {
    public static void main(String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();
        originator.setState("state 1");
        careTaker.addMemento(originator.save());
        originator.setState("state 2");
        careTaker.addMemento(originator.save());
        originator.setState("state 3");
        careTaker.addMemento(originator.save());
        System.out.println(careTaker.undo().getMementoState()); // state 2
        System.out.println(careTaker.undo().getMementoState()); // state 1
        System.out.println(careTaker.undo().getMementoState()); // state 1
        System.out.println(careTaker.redo().getMementoState()); // state 2
        System.out.println(careTaker.redo().getMementoState()); // state 3
        System.out.println(careTaker.redo().getMementoState()); // state 3
        originator.setState("new state3");
        careTaker.addMemento(originator.save());
        System.out.println(careTaker.getLastMemento().getMementoState()); // new state3
    }
}