Java23种设计模式(GOF)——备忘录模式

备忘录模式(memento)

场景

  • word文档编辑,电脑断电或死机,再打开,提示恢复到以前的文档
  • 微信消息或邮件系统中,消息、邮件撤回
  • 棋类游戏中的悔棋
  • 软件中的回退操作
  • 数据库管理中,事务管理的回滚操作

核心

保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。

结构

  • 源发器类Originator
  • 备忘录类Memento
  • 负责人类CareTake

案例

/**
 * 源发器类
 * @author huangyzh
 * @create 2020-05-20 1:01
 */
public class Emp {
    private String ename;
    private int age;
    private double salary;

    //进行备忘操作,并返回备忘录对象
    public EmpMemento memento(){
        return new EmpMemento(this);
    }

    //进行数据恢复,恢复为指定备忘录对象的值
    public void recovery(EmpMemento empMemento){
        this.ename = empMemento.getEname();
        this.age = empMemento.getAge();
        this.salary = empMemento.getSalary();
    }
	//省略 构造器 getter setter toString方法
}
/**
 * 备忘录类
 * 负责存储进行Emp对象的内部状态,并可防止Emp对象以外的其他对象访问备忘录
 * @author huangyzh
 * @create 2020-05-20 1:02
 */
public class EmpMemento {
    private String ename;
    private int age;
    private double salary;

    public EmpMemento(Emp emp){
        this.ename = emp.getEname();
        this.age = emp.getAge();
        this.salary = emp.getSalary();
    }
	//省略getter setter方法
}
/**
 * 负责人类:管理备忘录对象
 * 负责保存好备忘录
 * @author huangyzh
 * @create 2020-05-20 1:07
 */
public class CareTake {

    private EmpMemento empMemento;
    //可以通过增加容器,设置多个“备忘点”
//    private List<EmpMemento> empMementoList = new ArrayList<>();

    //备忘点较多时
    //1.可以将备忘录压栈
//    private Stack<EmpMemento> empMementoStack = new Stack<>();

    //2.如果占用内存中太大,可以使用序列化,反序列化

    public CareTake(EmpMemento empMemento) {
        this.empMemento = empMemento;
    }

    public EmpMemento getEmpMemento() {
        return empMemento;
    }
}
public class Test01 {
    public static void main(String[] args) {
        Emp emp = new Emp("小王",19,3400);
        System.out.println("初始化对象:"+emp);

        CareTake take = new CareTake(emp.memento());//备份

        emp.setAge(25);
        emp.setSalary(7800);
        emp.setEname("小李");
        System.out.println("修改后的对象为:"+emp);

        emp.recovery(take.getEmpMemento());

        System.out.println("复原后的对象为:"+emp);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值