一、描述
定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复至原来保存的状态。
理解:当需要保存某个对象的操作数据或者该对象状态时,使用另外一个类记录原始对象的数据以及状态,以便回退到以前的某种数据。
角色:
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