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

·

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

·

一、简述

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

二、备忘录模式(Memento Pattern)

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

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

备忘录模式的UML类图:

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

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

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

eclipse结构图

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

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

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

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

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

原创文章 59 获赞 262 访问量 4万+

猜你喜欢

转载自blog.csdn.net/IT_charge/article/details/105795121