首页 > 其他分享 >【设计模式】24.行为型模式-备忘录(Memento)

【设计模式】24.行为型模式-备忘录(Memento)

时间:2022-08-22 18:14:03浏览次数:56  
标签:24 状态 hero private 备忘录 100 设计模式 public Memento

一、描述

  定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复至原来保存的状态。

  理解:当需要保存某个对象的操作数据或者该对象状态时,使用另外一个类记录原始对象的数据以及状态,以便回退到以前的某种数据。

  角色:

  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

相关文章

  • P2440 木材加工
    P2440木材加工分析:根据题意,先对所有的木材长度进行排序方便二分查找,写一个查找函数,每个木材都除以当前的切割长度(mid),看能切出几段,如果切出的段数大于要求的段数,证明查找......
  • 蚂蚁金服开源的这份SpringBoot笔记,曾在24小时内GitHub星标48k
    前言Spring的影响力想必就不用小编多说了,今天要跟大家说的是SpringBoot。SpringBoot作为目前Spring技术体系中炙手可热的框架之一,已经是开发者们的必备神器了。在实际......
  • 2022-08-21-设计模式之桥接模式
    java设计模式之桥接模式-学习整理23种设计模式---桥接模式什么是桥接模式?桥接模式的定义是?生活当中涉及到桥接模式的实例:桥接模式的结构及主要角色:咖啡案例实现(组......
  • 2022-08-21-设计模式之观察者模式
    java设计模式之观察者模式-学习整理23种设计模式---观察者模式什么是观察者模式?定义是什么?观察者模式包含的角色有什么?四个核心的角色:抽象观察者,具体观察者;抽象被观察......
  • STC8H开发(十六): GPIO驱动XL2400无线模块
    目录STC8H开发(一):在Keil5中配置和使用FwLib_STC8封装库(图文详解)STC8H开发(二):在LinuxVSCode中配置和使用FwLib_STC8封装库(图文详解)STC8H开发(三):基于FwLib......
  • 性能测试-压测工具ab-1024个并发以下可用以及ab和wrk的优缺点
    ab全称:ApacheBench,用于web性能压力测试,ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问。ab命令对发出负载的计算机要求很低,不会占用很高CPU......
  • Java学习 (24) 对象篇(04)static关键字
    目录static关键字语法实例代码块语法实例引用库语法实例static关键字static在类中修饰成员变量,在方法中则修饰成员方法static在属性中叫做静态属性,在方法中叫做静态......
  • 《GB6246-2011》PDF下载
    《GB6246-2011消防水带》PDF下载《GB6246-2011》简介本标准规定了消防水带的型号规格、性能要求、试验方法、检验规则以及标志、包装、运输、使用与维护;本标准适用于......
  • Visual AssistX (x64) Version 10.9.2458 Cracked
    说明1.只支持VisualAssistXx64的2458版本2.只支持VisualStudio2022版本3.出现错误提示说明安装的Vax版本不对。声明敬请各位大爷:如果之前使用过其他破解版......
  • 设计模式09 - 设计模式 - 装饰器模式(结构型)
    一、定义装饰器(Decorator)模式:指不改变现有对象结构的情况下,动态地给该对象增加额外功能。它是继承方式的一种替代方案。这种模式创建了一个装饰类,用来包装原有......