游戏与备忘者模式

来源:互联网 发布:日本男生 知乎 编辑:程序博客网 时间:2024/05/16 07:11

一、 模式定义:
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存前的状态。
二、 模式解说
在程序运行过程中,某些对象的状态处在转换过程中,可能由于某种原因需要保存此时对象的状态,以便程序运行到某个特定阶段,需要恢复到对象之前处于某个点时的状态。如果使用一些公有接口让其它对象来得到对象的状态,便会暴露对象的实现细节。
三、 结构图

1)备忘录(Memento)角色:备忘录角色存储“备忘发起角色”的内部状态。“备忘发起角色”根据需要决定备忘录角色存储“备忘发起角色”的哪些内部状态。为了防止“备忘发起角色”以外的其他对象访问备忘录。备忘录实际上有两个接口,“备忘录管理者角色”只能看到备忘录提供的窄接口——对于备忘录角色中存放的属性是不可见的。“备忘发起角色”则能够看到一个宽接口——能够得到自己放入备忘录角色中属性。
2)备忘发起(Originator)角色:“备忘发起角色”创建一个备忘录,用以记录当前时刻它的内部状态。在需要时使用备忘录恢复内部状态。
3)备忘录管理者(Caretaker)角色:负责保存好备忘录。不能对备忘录的内容进行操作或检查。
四、一个例子
这个例子是我从网上找到的,我觉得它比较形象,就拿过来直接用了。下面是这个例子的代码:

备忘发起(Originator)角色

public class PlayRole {private int vitality;//生命private int aggressivity;//战斗力private int defencivity;//防御力public PlayRole(int vitality, int aggressivity, int defencivity) {super();this.vitality = vitality;this.aggressivity = aggressivity;this.defencivity = defencivity;}public PlayRole() {}public int getVitality() {return vitality;}public void setVitality(int vitality) {this.vitality = vitality;}public int getAggressivity() {return aggressivity;}public void setAggressivity(int aggressivity) {this.aggressivity = aggressivity;}public int getDefencivity() {return defencivity;}public void setDefencivity(int defencivity) {this.defencivity = defencivity;}public RoleMemento createMemento() {RoleMemento memento = new RoleMemento();memento.setAggressivity(aggressivity);memento.setDefencivity(defencivity);memento.setVitality(vitality);return memento;}public void setMemento(RoleMemento memento) {this.aggressivity = memento.getAggressivity();this.defencivity = memento.getDefencivity();this.vitality = memento.getVitality();}public void showState() {System.out.println("攻击力:"+this.aggressivity+" 防御力:"+this.defencivity+" 生命力:"+this.vitality);}}

备忘录(Memento)角色

public class RoleMemento {private int vitality;private int aggressivity;private int defencivity;public void setVitality(int vitality) {this.vitality = vitality;}public void setAggressivity(int aggressivity) {this.aggressivity = aggressivity;}public void setDefencivity(int defencivity) {this.defencivity = defencivity;}public int getVitality() {return vitality;}public int getAggressivity() {return aggressivity;}public int getDefencivity() {return defencivity;}}

备忘录管理者(Caretaker)角色

public class Caretaker {RoleMemento memento;public RoleMemento getMemento() {return memento;}public void setMemento(RoleMemento memento) {this.memento = memento;}}

客户测试

public class Client {public static void main(String[] args) {// TODO Auto-generated method stub// 新建角色PlayRole role = new PlayRole(100, 100, 100);// 新建管理者  Caretaker taker = new Caretaker();// 角色初始状态System.out.println("游戏刚开始,角色各属性:");role.showState();// 利用备忘录模式保存当前状态System.out.println("【保存游戏状态!】");taker.setMemento(role.createMemento());role.setAggressivity(20);role.setDefencivity(30);role.setVitality(0);// 大战过后,角色能力值下降System.out.println("与Boss对战后,角色各项能力已大大下降:");role.showState();// 恢复保存的角色状态role.setMemento(taker.getMemento());System.out.println("【恢复保存的角色状态!】");System.out.println("恢复后角色的当前状态:");role.showState();}}


运行结果:

游戏刚开始,角色各属性:
攻击力:100 防御力:100 生命力:100
【保存游戏状态!】
与Boss对战后,角色各项能力已大大下降:
攻击力:20 防御力:30 生命力:0
【恢复保存的角色状态!】
恢复后角色的当前状态:
攻击力:100 防御力:100 生命力:100

原创粉丝点击