Gof-备忘录模式

继续打卡设计模式

今天来聊一下的是备忘录模式

一、实际问题

先看一个实际问题。
游戏角色有攻击力和防御力,在大战 Boss 前保存自身的状态(攻击力和防御力),当大战 Boss 后攻击力和防御 力下降,从备忘录对象恢复到大战前的状态

分析该问题
这个问题就是说保存一个对象的某一时刻的状态。基于这个状态我们可以选择在某个节点来恢复。
简单的逻辑我们可以想到的是我们可以先new一个对象,再把需要备份的数据放到这个新对象,但这就暴露了 对象内部的细节。

二、备忘录模式解决问题

/**
 * @author: 德鑫
 * Description:
 * @Date: 2021/02/03
 */

public class Originator {
    private String state;//状态信息

    public String getState() {
        return state;
    }

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

    //编写一个方法保存一个状态对象Memento
    public Memento saveStateMemento(){
        return new Memento(state);
    }

    //通过备忘录对象,恢复状态
    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

可以看到里面说Memento 那么我们就需要一个Memento 备忘录对象来保存状态

/**
 * @author: 德鑫
 * Description:
 * @Date: 2021/02/03
 */

public class Memento {
    private String state;

    //构造器
    public Memento(String state) {
        super();
        this.state = state;
    }

    public String getState() {
        return state;
    }
}
/**
 * @author: 德鑫
 * Description:
 * @Date: 2021/02/03
 */

public class Caretaker {

    private List<Memento> mementoList = new ArrayList<>();

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

    public List<Memento> getMementoList() {
        return mementoList;
    }
}

最后写一个客户端测试

/**
 * @author: 德鑫
 * Description:
 * @Date: 2021/02/03
 */

public class Client {
    public static void main(String[] args) {

        Originator originator = new Originator();

        Caretaker caretaker = new Caretaker();

        originator.setState(" 状态#1 攻击力 100 ");

        //保存了当前的状态
        caretaker.add(originator.saveStateMemento());

        originator.setState(" 状态#2 攻击力 80 ");

        caretaker.add(originator.saveStateMemento());


        originator.setState(" 状态#3 攻击力 50 ");
        caretaker.add(originator.saveStateMemento());

        System.out.println("当前的状态是 =" + originator.getState());

        //希望得到状态 1, 将 originator 恢复到状态1
        originator.getStateFromMemento(caretaker.getMementoList().get(0));
        System.out.println("需要恢复到状态1");
        System.out.println("当前的状态是 =" + originator.getState());
    }
}

三、备忘录模式总结

  1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
  2. 实现了信息的封装,使得用户不需要关心状态的保存细节
  3. 如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存, 这个需要注意
  4. 适用的应用场景:
    1、后悔药。
    2、打游戏时的存档。
    3、Windows 里的 ctri + z。
    4、IE 中的后退。
    5、数 据库的事务管理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值