首页 > 其他分享 >(十六)备忘录模式

(十六)备忘录模式

时间:2022-12-02 17:58:16浏览次数:51  
标签:状态 int hp 十六 atk 模式 备忘录 public def

1 概述

备忘录(Memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

  • Originator(发起人):负责创建一个备忘录 Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator 可根据需要决定 Memento 存储 Originator 的哪些内部状态。

  • Memento(备忘录):负责存储 Originator 对象的内部状态,并可防止 Originator 以外的其他对象访问备忘录 Memento。备忘录有两个接口,Caretaker 只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator 能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。

  • Caretaker(管理者):负责保存好备忘录 Memento,不能对备忘录的内容进行操作或检查。

把要保存的细节给封装在 Memento 中,要更改保存的细节也不用影响客户端。

2 使用条件

  • Memento 模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator 可以根据保存的 Memento 信息还原到前一状态。

  • 如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。

  • 有时一些对象的内部信息必须保存在对象以外的地方,但是必须要由对象自己读取,这时,使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。

  • 当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

3 示例

游戏进度备忘:模拟游戏角色的存档与恢复功能。

游戏角色类

public class GameRole {
    private int hp; // 生命
    private int atk; // 攻击
    private int def; // 防御

    // “保存角色状态”方法,将游戏角色的三个状态值通过实例化“角色状态存储箱”返回
    public RoleStateMemento saveState() {
        return new RoleStateMemento(hp, atk, def);
    }

    // “恢复角色状态”方法,可将外部的“角色状态存储箱”中状态值恢复给游戏角色
    public void recoveryState(RoleStateMemento memento) {
        this.hp = memento.getHp();
        this.atk = memento.getAtk();
        this.def = memento.getDef();
    }

    // 初始化状态
    public void initState() {
        this.hp = 100;
        this.atk = 100;
        this.def = 100;
    }

    // 战斗
    public void fight() {
        this.hp = 0;
    }

    // 状态显示
    public void stateDisplay() {
        System.out.println("当前角色状态:");
        System.out.println("生命值:" + this.hp);
        System.out.println("攻击力:" + this.atk);
        System.out.println("防御力:" + this.def);
    }

    public int getHp() {
        return hp;
    }

    public void setHp(int hp) {
        this.hp = hp;
    }

    public int getAtk() {
        return atk;
    }

    public void setAtk(int atk) {
        this.atk = atk;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}

角色状态存储箱类

public class RoleStateMemento {
    private int hp; // 生命
    private int atk; // 攻击
    private int def; // 防御

    // 将生命力、攻击力、防御力存入状态存储箱对象中
    public RoleStateMemento(int hp, int atk, int def) {
        this.hp = hp;
        this.atk = atk;
        this.def = def;
    }

    public int getHp() {
        return hp;
    }

    public void setHp(int hp) {
        this.hp = hp;
    }

    public int getAtk() {
        return atk;
    }

    public void setAtk(int atk) {
        this.atk = atk;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}

角色状态管理者类

public class RoleStateCaretaker {
    private RoleStateMemento memento;

    public RoleStateMemento getMemento() {
        return memento;
    }

    public void setMemento(RoleStateMemento memento) {
        this.memento = memento;
    }
}

客户端代码

public class Client {
    public static void main(String[] args) {
        // Boss战前
        // 游戏角色初始状态,三项指标数据都是100
        GameRole role = new GameRole();
        role.initState();
        role.stateDisplay();

        // 保存进度
        // 保存进度时,由于封装在Memento中,因此我们并不知道保存了哪些具体的角色数据
        RoleStateCaretaker stateAdmin = new RoleStateCaretaker();
        stateAdmin.setMemento(role.saveState());

        // 大战Boss时,损耗严重
        // 开始打Boss,非常糟糕,GameOver了
        role.fight();
        role.stateDisplay();

        // 恢复之前状态
        role.recoveryState(stateAdmin.getMemento());
        role.stateDisplay();
    }
}

输出入下

当前角色状态:
生命值:100
攻击力:100
防御力:100
当前角色状态:
生命值:0
攻击力:100
防御力:100
当前角色状态:
生命值:100
攻击力:100
防御力:100

Process finished with exit code 0

参考书籍:
《大话设计模式》

标签:状态,int,hp,十六,atk,模式,备忘录,public,def
From: https://www.cnblogs.com/dalelee/p/16944901.html

相关文章

  • 数字化虚拟仿真教学系统,打造"互联网+"教学培训新模式
    随着互联网技术的不断发展,教育培训工作也迎来了发展的机遇和挑战。互联网有着实时性、交换性、共享性、开放性等特点,将教育培训与互联网相结合,增强了信息整合性、操作的便......
  • 设计模式之状态模式笔记
    刚看书看到的,关于一个设计模式的状态模式的不错的讲解,是以QQ的登陆.在线,忙碌,离线四个状态的一个说明,代码如下状态的接口类:publicinterfaceQQState{   voidhan......
  • 设计模式之职责链模式笔记
    这个模式用的不多,笔记之,病人去医院看病的例子,来自易说设计模式一书publicabstractclassDoctor{   publicabstractvoidseeDoctor(XiaoGongxiaoGong);   p......
  • FTP两种传输模式小结
    FTP是有两种传输的模式的,主动模式和被动模式,之前一直没怎么去搞明白之,现在找了下资料,重新整理了下: 一个完整的FTP文件传输需要建立两种类型的连......
  • 设计模式之备忘录模式
    概述备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。当前很多......
  • C# CRC16数据校验支持ModelBus和XMODEM校验模式
    C#CRC16数据校验支持ModelBus和XMODEM校验模式最近在研究C#CRC数据校验规则,之前用过ModelBus模式,但是这次的现场用到的是XMODEM模式,写一篇文章记录实现细节,方便后期快速开......
  • WPF MVVM模式下如何给Textbox设置焦点(GalaSoft.MvvmLight)
    项目场景:最近在使用WPFMVVM模式进行开发的时候遇到了个头大的问题,就是如何通过VM去驱动V里面的试图控件,例如最简单的通过VM里面去控制前端页面里面的文本框焦点问题,平常简......
  • 深入浅出Seata的AT模式
    目录一、业务背景二、Seata架构1、核心组件2、AT模式三、案例分析1、流程分析2、写隔离3、读隔离四、对比XA模式五、参考源码单个掉队,导致集体被动摆烂;一、业务背景在......
  • 设计模式: 管道模式(Pipeline Pattern)
    目录基础概念使用场景场景描述定义通用管道上下文定义管道上下文处理器定义业务上下文类型和所需处理器业务上下文处理器-校验处理器-生成模型实例处理器-持久化处理......
  • 页面css哀悼模式
      查找的一波样式原来是css的:filter:grayscale(100%);//灰度   ......