前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在王者荣耀角度下分析面向对象程序设计B中23种设计模式之备忘录模式

在王者荣耀角度下分析面向对象程序设计B中23种设计模式之备忘录模式

作者头像
荣仔_最靓的仔
发布2021-02-02 17:35:45
2960
发布2021-02-02 17:35:45
举报

·

备忘录模式在王者荣耀中的应用

·

一、简述

在王者荣耀的游戏中,贤者的庇护这件装备设计的初衷是提高容错率,常常出现在游戏后期,玩家通过装备贤者的庇护在危急时刻可以实现复活效果,进而保命。

二、备忘录模式(Memento Pattern)

备忘录模式理解: 高度概括:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。 给定一个语言,定义他的文法的一种表示并定义一个解释器,这个解释器使用该表是来解释语言中的句子。 对象的状态依赖于它的变量的取值情况,对象在程序运行期间的各个时刻可能具有不同的状态,在某些应用中,程序可能需要使用一种合理的方式来保存对象,在某一时刻的状态,以便在需要时对象能恢复到原先保存的状态,在备忘录模式中称需要保存状态的对象为原发者,称负责保存原发者状态的对象为备忘录,称负责管理备忘录的对象为负责人,备忘录模式要求原发者可以访问备忘录中的细节,即可以访问备忘录中的数据,以便恢复原发者的状态,而负责人只能保存和得到备忘录,但访问备忘录中的数据受到一定的限制,备忘录模式使原发者可以将自己的状态暴露给备忘录,但其他对象想要获得备忘录中的数据,会受到一定的限制,这就保证了原发者暴露内部数据的同时,又保证了数据的封装性,另外,经过精心设计的备忘录,在保存原发者状态时,可能只需要保存原发者的部分变量即可。也就是说,备忘录通过保存原发者状态中最本质的数据,就能使原发者根据此备忘录中的数据,恢复原始状态。

备忘录模式结构中的三种角色: ①原发者(Originator):需要在某个时刻保存其状态的对象,原发者负责创建备忘录,比如使用createMemento()方法,创建一个备忘录,然后原发者使用该备忘录记录自己的状态,当原发者需要恢复某个时刻的状态时,它通过获得相应备忘录中的数据来恢复那个时刻的状态,比如原发者调用restoreFromMemento(Memento mem)方法,并通过参数mem指定的备忘录恢复状态; ②备忘录(Memento):负责存储原发者状态的对象,创建备忘录的类和创建原发者的类在同一个包中,该类提供的访问数据的方法都是友好方法,使得只有和原发者在同一个包中的类的实例,才可以访问备忘录中的数据; ③负责人(Caretaker):负责管理保存备忘录的对象,负责人如果不合原发者在同一个包中,就不能对备忘录中的内容进行修改或读取,如果需要将备忘录保存到磁盘,负责人可以使用对象刘将备忘录写入文件。

备忘录模式的UML类图:

备忘录模式的优缺点: 优点: ①备忘录模式使用备忘录可以把原发者的内部状态保存起来,使只有很亲密的对,可以访问备忘录中的数据; ②备忘录模式强调人类设计单一责任原则,即将状态的刻画和保存分开; 缺点: 如果备忘录需要存储大量的数据或非常频繁的创建备忘录,可能会导致非常大的存储开销

备忘录模式的适用情景: 必须保存一个对象在某一时刻的全部或部分状态,以便在需要时恢复该对象先前的状态; 一个对象不想通过提供public权限的,诸如getXXX()的方法让其他对象得到自己的内部状态。

三、王者荣耀角度下实现备忘录模式结构图及代码

eclipse结构图

主函数【应用(Application)】 Applicayion.java

代码语言:javascript
复制
package angle_mementoPattern;

import angle_mementoPattern.Caretaker;
import angle_mementoPattern.Originator;

public class Application {

    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        System.out.println("★★★当玩家装备中有{贤者的庇护}时★★★");
        
        originator.setState("alive");
        System.out.println("      →玩家状态:" + originator.getState());
        caretaker.saveMemento(originator.createMemento());
    
        System.out.println("");
        System.out.println("★★★玩家被击杀时,触发装备效果★★★");
        
        originator.setState("death");
        System.out.println("      →玩家状态:" + originator.getState());
   
        originator.restoreMemento(caretaker.retrieveMemento());

        System.out.println("");
        System.out.println("★★★装备出发效果2秒后★★★");
        System.out.println("      →玩家状态:" + originator.getState());
    }
}

原发者(Originator) Originator,java

代码语言:javascript
复制
package angle_mementoPattern;

import angle_mementoPattern.Memento;

public class Originator {

    private String state;

    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public Memento createMemento() {
        return new Memento(state);
    }

    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }
}

备忘录(Memento) Memento.java

代码语言:javascript
复制
package angle_mementoPattern;

public class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

负责人(Caretaker) Caretaker.java

代码语言:javascript
复制
package angle_mementoPattern;

import angle_mementoPattern.Memento;

public class Caretaker {
    private Memento memento;

    public Memento retrieveMemento() {
        return this.memento;
    }

    public void saveMemento(Memento memento) {
        this.memento = memento;
    }
}

运行结果截图

更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏。

欢迎留言,一起学习交流~

感谢阅读

END

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ·
  • 备忘录模式在王者荣耀中的应用
  • ·
  • 一、简述
  • 二、备忘录模式(Memento Pattern)
    • 三、王者荣耀角度下实现备忘录模式结构图及代码
    • 欢迎留言,一起学习交流~
    • END
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档