游戏与备忘者模式

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值