在王者荣耀的游戏中,贤者的庇护这件装备设计的初衷是提高容错率,常常出现在游戏后期,玩家通过装备贤者的庇护在危急时刻可以实现复活效果,进而保命。
备忘录模式理解: 高度概括:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。 给定一个语言,定义他的文法的一种表示并定义一个解释器,这个解释器使用该表是来解释语言中的句子。 对象的状态依赖于它的变量的取值情况,对象在程序运行期间的各个时刻可能具有不同的状态,在某些应用中,程序可能需要使用一种合理的方式来保存对象,在某一时刻的状态,以便在需要时对象能恢复到原先保存的状态,在备忘录模式中称需要保存状态的对象为原发者,称负责保存原发者状态的对象为备忘录,称负责管理备忘录的对象为负责人,备忘录模式要求原发者可以访问备忘录中的细节,即可以访问备忘录中的数据,以便恢复原发者的状态,而负责人只能保存和得到备忘录,但访问备忘录中的数据受到一定的限制,备忘录模式使原发者可以将自己的状态暴露给备忘录,但其他对象想要获得备忘录中的数据,会受到一定的限制,这就保证了原发者暴露内部数据的同时,又保证了数据的封装性,另外,经过精心设计的备忘录,在保存原发者状态时,可能只需要保存原发者的部分变量即可。也就是说,备忘录通过保存原发者状态中最本质的数据,就能使原发者根据此备忘录中的数据,恢复原始状态。
备忘录模式结构中的三种角色: ①原发者(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; }}
运行结果截图
更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏。
感谢阅读
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。