JAVA 设计模式04 - 备忘录模式

304 阅读1分钟

01备忘录本质

备份原有对象,能够返回备忘点

02 场景

  • 软件的返回上一步,下一步
  • 数据库的事务回滚

03 代码实现

备忘录对象用于记录对象的全部信息,通过负责人类来恢复和存储备份点。

/**
 * 原有对象
 */
@Data
@AllArgsConstructor
class Obj {

    private int age;
    private String name;
    private String address;

    //备忘操作
    public ObjMemo memo() {
        return new ObjMemo(this);
    }

    //恢复
    public void recover(ObjMemo memo) {
        this.age = memo.getAge();
        this.name = memo.getName();
        this.address = memo.getAddress();
    }

}
/**
 * 备忘录对象
 */
@Data
class ObjMemo {

    private int age;
    private String name;
    private String address;

    public ObjMemo(Obj obj) {
        this.age = obj.getAge();
        this.name = obj.getName();
        this.address = obj.getAddress();
    }

}
/**
 * 负责人类
 *
 * @author Harvey
 * @create 2018-04-07 上午12:30
 **/
public class MemoCareTaker {

    //用于存储备份点
    private Stack<ObjMemo> stack = new Stack<>();

    public ObjMemo getMemo() {
        return stack.pop();
    }

    public void setMemo(ObjMemo memo) {
        stack.add(memo);
    }

}

调用:

        MemoCareTaker taker = new MemoCareTaker();

        Obj obj = new Obj(12,"harvey","beijing");

        System.out.println(obj);

        taker.setMemo(obj.memo());

        obj.setAge(30);

        System.out.println("change===>" + obj);

        obj.recover(taker.getMemo());

        System.out.println("recover====>" + obj);

结果:

Obj(age=12, name=harvey, address=beijing)
change===>Obj(age=30, name=harvey, address=beijing)
recover====>Obj(age=12, name=harvey, address=beijing)