一、描述
定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复至原来保存的状态。
理解:当需要保存某个对象的操作数据或者该对象状态时,使用另外一个类记录原始对象的数据以及状态,以便回退到以前的某种数据。
角色:
1.Originator(原发器):定义原始类的数据以及状态信息,包含创建备忘录的方法。
2.Memonto(备忘录):定义与原始类相同的业务数据结构。
3.CareTaker(负责人):负责存储备忘录。
类图:
二、优点
1.给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2.实现了信息的封装,使得用户不需要关心状态的保存细节。
三、缺点
1.消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
四、使用场景
1.需要保存或者恢复数据的相关状态场景。
2.提供一个可回滚的操作。
五、示例
玩儿过游戏的都知道,英雄在被杀死之后,状态会变为等待复活。当复活之后,状态、等级之类的数据会恢复到上次死亡之前。以“王者荣耀中的英雄为例”:玩妲己,当前等级为12,被敌方英雄打死之后,状态为死亡,各种装备都不能使用;等待一段时间之后满血复活,恢复为复活状态。
1.英雄(原发器)
- /**
- * Hero
- * 英雄
- *
- * @author zhouxy
- * @date 2022/8/1
- **/
- @Data
- public class Hero {
- /** 状态 */
- private String state;
- /** 生命值 */
- private int life;
- /** 伤害 */
- private int damage;
- /** 防御力 */
- private int defense;
-
- /**
- * 创建备忘录对象,并且将当前数据信息赋值给备忘录
- *
- * @return
- */
- public HeroMemento createHeroMemento() {
- HeroMemento memento = new HeroMemento();
- memento.setState(this.state);
- memento.setLife(this.life);
- memento.setDamage(this.damage);
- memento.setDefense(this.defense);
- return memento;
- }
-
- /**
- * 还原当前对象信息
- */
- public void recover(HeroMemento heroMemento) {
- this.state = heroMemento.getState();
- this.life = heroMemento.getLife();
- this.damage = heroMemento.getDamage();
- this.defense = heroMemento.getDefense();
- }
-
- public void display(){
- System.out.println("状态:" + this.state);
- System.out.println("生命:" + this.life);
- System.out.println("伤害:" + this.damage);
- System.out.println("防御力:" + this.defense);
- }
- }
2.英雄备忘录(备忘录)
- /**
- * HeroMemonto
- *
- * @author zhouxy
- * @date 2022/8/1
- **/
- @Data
- public class HeroMemento {
- /** 状态 */
- private String state;
- /** 生命值 */
- private int life;
- /** 伤害 */
- private int damage;
- /** 防御力 */
- private int defense;
- }
3.负责人
- /**
- * CareTaker
- *
- * @author zhouxy
- * @date 2022/8/1
- **/
- @Data
- public class CareTaker {
- public HeroMemento heroMemento;
- }
4.测试
- public class Client {
- public static void main(String[] args) throws InterruptedException {
- Hero hero = new Hero();
- hero.setState("战斗中");
- hero.setLife(100);
- hero.setDamage(100);
- hero.setDefense(100);
-
- //保存备忘录信息
- CareTaker careTaker = new CareTaker();
- careTaker.setHeroMemento(hero.createHeroMemento());
- hero.display();
-
- System.out.println("============战亡============");
- hero.setState("待复活");
- hero.setLife(0);
- hero.setDamage(0);
- hero.setDefense(0);
- hero.display();
-
-
- System.out.println("============等待5秒之后复活============");
- for (int i = 1; i <= 5; i++) {
- System.out.println(i + "秒");
- Thread.sleep(1000);
- }
- //取出备忘录数据,还原英雄数据
- System.out.println("============已复活============");
- hero.recover(careTaker.getHeroMemento());
- hero.display();
- }
- }
实现效果:
- 状态:战斗中
- 生命:100
- 伤害:100
- 防御力:100
- ============战亡============
- 状态:待复活
- 生命:0
- 伤害:0
- 防御力:0
- ============等待5秒之后复活============
- 1秒
- 2秒
- 3秒
- 4秒
- 5秒
- ============已复活============
- 状态:战斗中
- 生命:100
- 伤害:100
- 防御力:100