设计模式——备忘录模式

备忘录模式, 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态。 这样以后就可将该对象恢复到原先保存的状态。
两种角色:
- Originator 待备份的对象,负责创建和恢复备份数据
- Memento 备忘录对象,记录并储存对象中的属性等
示例代码:

// 备忘录角色
public class Memento {

    // 属性
    private int a;
    private int b;

    public Memento(int a, int b){
        this.a = a;
        this.b = b;
    }

    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }

}

// 待备份的原对象
public class Originator {

    // 两个属性
    private int a;
    private int b;

    // 备份方法
    public Memento saveToMemento(){
        return new Memento(this.a, this.b);
    }

    // 从备份中还原
    public void rollbackFromMemento(Memento memento){
        this.a = memento.getA();
        this.b = memento.getB();
    }

    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }

}

// 测试类
public class Test {

    public static void main(String[] args) {
        // 需备份的业务对象
        Originator originator = new Originator();
        originator.setA(3);
        originator.setB(4);
        // 备份到备份记录中
        Memento mem = originator.saveToMemento();
        System.out.println("备份中,a的值为 "+ mem.getA() +" b的值为 " + mem.getB());
        // 其他业务处理,对原对象进行属性修改等操作
        originator.setA(300);
        originator.setB(400);
        System.out.println("修改后,a的值为 "+ originator.getA() +" b的值为 " + originator.getB());
        // 如果需返回原始状态,重置各个属性
        originator.rollbackFromMemento(mem);
        System.out.println("回滚后,a的值为 "+ originator.getA() +" b的值为 " + originator.getB());
    }

}

执行结果:

备份中,a的值为 3 b的值为 4
修改后,a的值为 300 b的值为 400
回滚后,a的值为 3 b的值为 4

需要恢复数据状态的场景可以考虑使用备忘录模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值