22.(行为型模式)java设计模式之备忘录模式

一、什么是备忘录模式(Memento Pattern)

定义:

  • 在不破坏封闭的前提下,捕获⼀个对象的内部状态,保存对象的某个状态,以便在适当的时候恢复对象,⼜叫做快照模式,属于⾏为模式。
  • 备忘录模式实现的⽅式需要保证被保存的对象状态不能被对象从外部访问。

应⽤场景:

  • 玩游戏的时候肯定有存档功能,下⼀次登录游戏时可以从上次退出的地⽅继续游戏。
  • 棋盘类游戏的悔棋、数据库事务回滚。
  • 需要记录⼀个对象的内部状态时,为了允许⽤户取消不确定或者错误的操作,能够恢复到原先的状态。
  • 提供⼀个可回滚的操作,如ctrl+z、浏览器回退按钮。

二、备忘录模式的实现方式

模式结构分析:

  • Originator: 发起者,记录当前的内部状态,并负责创建和恢复备忘录数据,允许访问返回到先前状态所需的所有数据,可以根据需要决定Memento存储⾃⼰的哪些内部状态
  • Memento: 备忘录,负责存储Originator发起⼈对象的内部状态,在需要的时候提供发起⼈需要的内部状态
  • Caretaker: 管理者,对备忘录进⾏管理、保存和提供备忘录,只能将备忘录传递给其他⻆⾊
  • Originator 和 Memento属性类似

类关系图:

统一模型:

代码实现:

查看代码

/*
* 发起者
* */
@Getter
@Setter
public class RoleOriginator {
    /*
    * 生命值
    * */
    private int live = 100;
    /**
     * 攻击⼒,会上涨
     */
    private int attack = 50;
    /*
    * 展示当前状况
    * */
    public void display(){
        System.out.println("开始=========");
        System.out.println("⽣命⼒:"+live);
        System.out.println("攻击⼒:"+attack);
        System.out.println("结束=========");
    }
    /*
    * 攻击性
    * */
    public void fight(){
        //攻击⼒会上涨
        this.attack = attack+2;
        //打架⽣命⼒会下降
        this.live = live - 10;
    }
    /*
    * 备忘录的恢复
    * */
    public void recoveryState(RoleStateMemento memento){
        this.attack = memento.getAttack();
        this.live = memento.getLive();
    }
    /**
     * 保存快照,存储状态
     * @return
     */
    public RoleStateMemento saveState(){
        return new RoleStateMemento(live,attack);
    }
}
/*
* 备忘录
* */
@Getter
@Setter
public class RoleStateMemento {
    /*
     * 生命值
     * */
    private int live = 100;
    /**
     * 攻击⼒,会上涨
     */
    private int attack = 50;

    public RoleStateMemento(int live, int attack) {
        this.live = live;
        this.attack = attack;
    }
}
/*
* 状态管理者
* */
@Getter
@Setter
public class RoleStateCaretaker {
    private RoleStateMemento memento;
}

测试用例:

/*
* 备忘录模式
* */
@Test
public void memento(){
    RoleOriginator role = new RoleOriginator();
    role.display();
    role.fight();
    role.display();
    System.out.println("保存上⾯的快照");
    RoleStateCaretaker caretaker = new RoleStateCaretaker();
    caretaker.setMemento(role.saveState());
    role.fight();
    role.fight();
    role.fight();
    role.fight();
    role.display();
    System.out.println("准备恢复快照");
    role.recoveryState(caretaker.getMemento());
    role.display();
}

测试结果:

开始=========
⽣命⼒:100
攻击⼒:50
结束=========
开始=========
⽣命⼒:90
攻击⼒:52
结束=========
保存上⾯的快照
开始=========
⽣命⼒:50
攻击⼒:60
结束=========
准备恢复快照
开始=========
⽣命⼒:90
攻击⼒:52
结束=========

方法评估:

优点:

  • 给⽤户提供了⼀种可以恢复状态的机制。
  • 实现了信息的封装,使得⽤户不需要关⼼状态的保存细节。

缺点:

  • 消耗更多的资源,⽽且每⼀次保存都会消耗⼀定的内存。
posted @ 2023-01-17 11:38  冰融心  阅读(54)  评论(0编辑  收藏  举报