二十三种设计模式(第十九种)-----备忘录模式(Memento)

本文介绍了备忘录模式,通过实例展示了如何在不破坏封装性的情况下,记录并恢复对象的内部状态。备忘录类用于保存状态,守护者对象负责管理和获取这些状态,而游戏角色类则利用备忘录来实现状态的回滚。通过备忘录模式,可以在需要时将对象恢复到之前保存的状态,确保了业务流程的灵活性。
摘要由CSDN通过智能技术生成

二十三种设计模式(第十九种)-----备忘录模式(Memento)

尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=11487053970269878470

  1. 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
  2. 可以这样理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以访忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些状态,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作
  3. 备忘录模式属于行为型模式

类图

备忘录模式类图

需求

需求

需求类图

需求类图

代码

1.备忘录类

@Data
public class Memento {

    //攻击力
    private int vit;
    //防御力
    private int def;

    public Memento(int vit, int def) {
        this.vit = vit;
        this.def = def;
    }
}

2.守护者对象,保存游戏对象的状态

public class Caretaker {

    //如果只保存一次状态
    private Memento memento;
    //对GameRole保存多次状态
    //private ArrayList<Memento> mementos;
    //对多个游戏角色保存多个状态
    //private HashMap<String,ArrayList<Memento>> rolesMementos;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento){
        this.memento = memento;
    }
}

3.游戏角色

@Data
public class GameRole {

    private int vit;
    private int def;

    //创建Memento,即根据当前的状态得到Memento
    public Memento createMemento() {
        return new Memento(vit,def);
    }

    //从备忘录对象,恢复GameRole的状态
    public void recoverGameRoleFromMemento(Memento memento) {
        this.vit = memento.getVit();
        this.def = memento.getDef();
    }

    //显示当前游戏角色的状态
    public void display() {
        System.out.println("游戏角色当前的攻击力:"+this.vit+"防御力:"+this.vit);
    }
    
}

4.客户端

public static void main(String[] args) {
    //创建游戏角色
    GameRole gameRole = new GameRole();
    gameRole.setVit(100);
    gameRole.setDef(100);

    System.out.println("和boss大战前的状态");
    gameRole.display();

    //把当前状态保存caretaker
    Caretaker caretaker = new Caretaker();
    caretaker.setMemento(gameRole.createMemento());

    System.out.println("和boss大战~~~");
    gameRole.setDef(30);
    gameRole.setVit(30);
    gameRole.display();
    System.out.println("大战后,使用备忘录对象恢复到大战前");

    gameRole.recoverGameRoleFromMemento(caretaker.getMemento());
    System.out.println("恢复后的状态");
    gameRole.display();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值