一、描述
定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复至原来保存的状态。
理解:当需要保存某个对象的操作数据或者该对象状态时,使用另外一个类记录原始对象的数据以及状态,以便回退到以前的某种数据。
角色:
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
标签:24,状态,hero,private,备忘录,100,设计模式,public,Memento From: https://www.cnblogs.com/catxx/p/16261956.html