备忘录模式

备忘录模式用于在不侵入原对象的情况下保存和回复对象状态。主要组成有原生类Originator,备忘录类Mementor,备忘录管理类CareTaker. Mementor负责记录Originator,CareTaker持有Mementor的引用,负责备忘录状态的管理。下面以一个可撤销的加减计算器为例说明备忘录模式。为了满足计算器类Calculator(相当于Originator)的功能完备性,Calculator对象持有了一个CareTaker对象的引用,这在标准的备忘录模式中是没有的。
原生类:Calculator.java,支持加减运算和撤销操作。

public class Calculator {
    private int val;
    private CareTaker careTaker;

    public Calculator(int val) {
        this.val = val;
        this.careTaker = new CareTaker();
        System.out.println("Initiate value to " + val);
        save();
    }

    public void add(int addi) {
        System.out.println(val + " + " + addi + " = " + (val + addi));
        val += addi;
        save();
    }

    public void subtract(int addi) {
        System.out.println(val + " - " + addi + " = " + (val - addi));
        val -= addi;
        save();
    }

    private void save() {
        careTaker.addMemento(new Memento(val));
    }

    public void undo() {
        val = careTaker.popMemento().getState();
        System.out.println("State restored to " + val);
    }
}

备忘录类:Memento.java

public class Memento {
    private int state;

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

    public int getState() {
        return state;
    }
}

备忘录管理类:CareTaker.java

import java.util.LinkedList;

public class CareTaker {
    private LinkedList<Memento> mementoList;

    public CareTaker() {
        mementoList = new LinkedList<>();
    }

    public void addMemento(Memento memento) {
        mementoList.add(memento);
    }

    public Memento popMemento() {
        mementoList.removeLast();
        return mementoList.getLast();
    }
}

驱动类:Main.java,执行了一系列运算和撤销操作。

public class Main {
    public static void main(String[] args) {
        Calculator cal = new Calculator(0);     // Initiate value to 0
        cal.add(1);                             // 0 + 1 = 1
        cal.add(2);                             // 1 + 2 = 3
        cal.subtract(4);                        // 3 - 4 = -1
        cal.subtract(5);                        // -1 - 5 = -6
        cal.undo();                             // State restored to -1
        cal.add(7);                             // -1 + 7 = 6
        cal.undo();                             // State restored to -1
        cal.undo();                             // State restored to 3
        cal.add(10);                            // 3 + 10 = 13
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值