小白谈谈备忘录模式

概念

备忘录模式就是用来保存一种状态的,能够在不破坏封装性的前提下,实现对象状态的保存和恢复工作。保存对象的状态是为了以后在需要的时候快速恢复到保存时的状态,通常与命令模式同时使用,那么就可以进行某些命令的恢复操作,恢复到修改之前的某一个状态中。

实现

案例:包租婆有一个小本本用来记录每个租客的租金缴纳情况
首先我们来定义一个小本本,专门用于记录缴纳情况的:

/**
 * 定义一个包租婆的备忘录
 * 用于记录每个租客的租金缴纳状态的
 */
public class Memento {

    //定义一个属性,用于记录每个租客的名字
    private String name;

    //定义一个属性,用于记录是否已经缴纳租金
    private boolean isPay;

    public Memento(String name, boolean isPay) {
        this.name = name;
        this.isPay = isPay;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isPay() {
        return isPay;
    }

    public void setPay(boolean pay) {
        isPay = pay;
    }
}

接下来我们定义租客这个类

/**
 * 定义租客的类,用于表示是否已经缴纳租金
 */
public class Tenants {

    //租客名字
    private String name;

    //租客是否已经缴纳租金
    private boolean state;

    public Tenants(String name, boolean state) {
        this.name = name;
        this.state = state;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean getState(){
        return state;
    }

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

    //保存租客缴费记录
    public Memento save(){
        return new Memento(name,state);
    }

    //租客查询自己缴费记录
    public void getStateFromMemento(Memento memento){
        state = memento.isPay();
    }
}

有小本本记录,那也得有它的持有者——包租婆呀

/**
 * 定义包租婆
 */
public class BaoZuPo {

    //展现包租婆的实力,拿出一本备忘录,记录所有租客的信息
    private List<Memento> list = new ArrayList<>();

    //每当有一个租客搬进来,就要添加
    public void add(Memento memento){
        list.add(memento);
    }

    //同样的搬走一个租客,就要扔掉这个备忘录
    public void remove(Memento memento){
        list.remove(memento);
    }

    //获取备忘录上第i个租客的缴费信息
    public Memento get(int i){
        return list.get(i);
    }
}

月初了,包租婆要进行收租工作了:

/**
 * 每到月初,包租婆就要拿起她的小本本了
 */
public class Begin {

    public static void main(String[] args) {

        //定义租客ctb,月初没钱
        Tenants t1 = new Tenants("ctb",false);

        //定义小明,懒皮
        Tenants t2 = new Tenants("小明",false);

        //定义小小,缴过租金了
        Tenants t3 = new Tenants("小小",true);

        //包租婆开始记录了
        BaoZuPo baoZuPo = new BaoZuPo();

        baoZuPo.add(t1.save());
        baoZuPo.add(t2.save());
        baoZuPo.add(t3.save());

        //租金缴纳情况
        System.out.println(t1.getName() +"是否已经交租金了," + t1.getState());
        System.out.println(t2.getName() +"是否已经交租金了," + t2.getState());
        System.out.println(t3.getName() +"是否已经交租金了," + t3.getState());


        System.out.println("过去两天");
        //两天后,老板终于发人工了,我有钱交房租了
        t1.setState(true);

        System.out.println(t1.getName() +"是否已经交租金了," + t1.getState());

        //包租婆查看两天前记录
        t1.getStateFromMemento(baoZuPo.get(0));
        System.out.println(t1.getName() +"两天前是否已经交租金" + t1.getState());

    }
}

实验结果:
在这里插入图片描述

优点:给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态,实现了信息的封装,使得用户不需要关心状态的保存细节

缺点:消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存


参考文案:https://www.runoob.com/design-pattern/memento-pattern.html
本文的代码:https://pan.baidu.com/s/1wieoVS85aSwQpBLGjpbQ6Q
提取码:tvc5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值