首页 > 其他分享 >20230426 18. 备忘录模式 - 游戏人物

20230426 18. 备忘录模式 - 游戏人物

时间:2023-06-19 09:58:09浏览次数:71  
标签:状态 20230426 18 System 备忘录 println public Memento

介绍

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

备忘录模式

  • Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。
  • Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
  • Caretaker(管理者):负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查。

要保存的细节给封装在了Memento中了,哪一天要更改保存的细节也不用影响客户端了

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

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

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

备忘录模式也是有缺点的,角色状态需要完整存储到备忘录对象中,如果状态数据很大很多,那么在资源消耗上,备忘录对象会非常耗内存。

代码示例

Originator类

/**
 * 游戏人物
 *
 */
@Data
public class GameRole {
    private int vitality;// 生命力
    private int attack;// 攻击力
    private int defense;// 防御力

    public void displayState() {
        System.out.println("角色当前状态:");
        System.out.println("体力:" + this.vitality);
        System.out.println("攻击力:" + this.attack);
        System.out.println("防御力:" + this.defense);
        System.out.println();
    }

    // 获得初始状态(数据通常来自本机磁盘或远程数据接口)
    public void getInitState() {
        this.vitality = 100;
        this.attack = 100;
        this.defense = 100;
    }

    // 战斗(在与Boss大战后游戏数据损耗为0)
    public void fight() {
        this.vitality = 0;
        this.attack = 0;
        this.defense = 0;
    }

    public RoleStateMemento saveState() {
        return new RoleStateMemento(vitality, attack, defense);
    }

    public void recoverState(RoleStateMemento memento) {
        this.vitality = memento.getVitality();
        this.attack = memento.getAttack();
        this.defense = memento.getDefense();
    }

}

Memento类

/**
 * 角色状态存储箱
 *
 */
@Data
@AllArgsConstructor
public class RoleStateMemento {
    private int vitality;
    private int attack;
    private int defense;
}

Caretaker类

/**
 * 角色状态管理者
 *
 */
@Data
public class RoleStateCaretaker {
    private RoleStateMemento memento;
}

客户端

public class Test {
    public static void main(String[] args) {
        // 大战Boss前
        System.out.println("===大战Boss前===");
        GameRole role = new GameRole();
        role.getInitState();
        role.displayState();

        // 保存进度
        RoleStateCaretaker caretaker = new RoleStateCaretaker();
        caretaker.setMemento(role.saveState());

        // 大战Boss时,损耗严重
        System.out.println("===大战Boss时,损耗严重===");
        role.fight();
        role.displayState();

        //游戏进度恢复
        System.out.println("===游戏进度恢复===");
        role.recoverState(caretaker.getMemento());
        role.displayState();
        
    }
}

标签:状态,20230426,18,System,备忘录,println,public,Memento
From: https://www.cnblogs.com/huangwenjie/p/17490365.html

相关文章

  • 20230426 17. 适配器模式 - NBA外籍中锋
    介绍适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要解决的问题:简单地说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它系统的数据和......
  • 20230426 16. 状态模式 - 工作状态
    介绍状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化State类,抽象状态类,定义一......
  • 20230426 19. 组合模式 - 分公司
    介绍组合模式(Composite),将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为Leaf在组合中表示叶节点对象,叶节点没有子节点Composite定义......
  • 20230426 20. 迭代器模式
    介绍迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供......
  • 20230418 0. 面向对象基础
    面向对象的三大特性:封装、继承、多态面向对象的好处:可维护、可扩展、可复用、灵活性好封装每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。封装有很多好处:第一,良好的封装能够减少耦合第二,类内部的实现可以自由地修......
  • 20230418 0.1. UML
    UML这一节非常帮!!!1.11UML类图几种关系以及代码示例继承classBirdextendsAnimal{}实现classWideGooseimplementsIFly{}关联Association企鹅需要'知道'气候的变化,需要'了解'气候规律。当一个类'知道'另一个类时,可以用关联(association)。classPenguinex......
  • CF1835C. Twin Clusters
    题目大意给出一个长为\(2^{K+1}\)的序列,每个元素在\([0,4^K)\)之间,在序列中找到两个不相交的区间使得二者的异或和相等\(K<=17,\sum2^{K+1}<=2^{18}\)题解好题,但最后没有break出去绝杀失败了,rk70=>rk150因为元素大小是\(4^K\)级别的,和大小相关的算法(FWT)都没用了,所以不如直接......
  • ChatGPT4+Midjourney镜像网站汇总-6月18日更新
    如何在国内使用ChatGPT4和Midjourney?本文将给出多个无需注册,无需登录,无需梯子,即可在国内使用ChatGPT的套壳网站,也称为镜像网站。......
  • 6月18日
    6-1最小生成树(普里姆算法) 试实现普里姆最小生成树算法。函数接口定义: voidPrim(AMGraphG,charu); 其中 G 是基于邻接矩阵存储表示的无向图,u表示起点voidPrim(AMGraphG,charv){intdistance[G.vexnum];intparent[G.vexnum];......
  • 2023.6.18拷逝
    T1如图,从\(x_1\)能且只能走到\(x_1+2,x_1+4,x_1+6...\)设\(f[x]\)表示从\(x_1\)走到\(x\)的方案数,那么如果\(x-x_1\)是偶数,那么\(f[x]=f[x-2]+f[x-4]+...+f[x_1]\),否则\(f[x]=0\)。初始值:\(f[x_1]=1\)。考虑\(f[x]\)的前几项。\(f[x_1]=1,f[x_1+2]=1,f[x_......