18.备忘录模式

package memento;
/*
 * :以前的小霸王游戏是不是可以保存游戏进度?
 * :是的
 * :那是怎么实现的呢?
 * :应该是...
 * :来 先简单实现一下  
 * 
 */
public class Commonly {
	public static void main(String[] args) {
		GameRole gameRole = new GameRole();
		gameRole.GetInitState();
		gameRole.Display();
		
		//备份
		GameRole gameRole2 = new GameRole();
		gameRole2.setVit(gameRole.getVit());
		gameRole2.setAtk(gameRole.getAtk());
		gameRole2.setDef(gameRole.getDef());
		
		gameRole.Fight();
		gameRole.Display();
		
		//恢复状态
		gameRole.setVit(gameRole2.getVit());
		gameRole.setAtk(gameRole2.getAtk());
		gameRole.setDef(gameRole2.getDef());
		
		gameRole.Display();
		
		
		
		/*
		 * 把属性给用户开放了 不是很好的选择   代码未错未必优
		 */
	}
}

class GameRole{
	//生命力
	private int vit;
	//***力
	private int atk;
	//防御力
	private int def;
	
	/*
	 * 展示角色信息
	 */
	public void Display(){
		System.out.println("角色当前状态:");
		System.out.println("体力:"+vit);
		System.out.println("***力"+atk);
		System.out.println("防御力"+def);
	}

	/*
	 * 获得初始状态
	 */
	public void GetInitState(){
		this.vit = 100;
		this.atk = 100;
		this.def = 100;
	}
	
	/*
	 *战斗
	 */
	public void Fight(){
		this.vit = 0;
		this.atk = 0;
		this.def = 0;
	}

	public int getVit() {
		return vit;
	}

	public void setVit(int vit) {
		this.vit = vit;
	}

	public int getAtk() {
		return atk;
	}

	public void setAtk(int atk) {
		this.atk = atk;
	}

	public int getDef() {
		return def;
	}

	public void setDef(int def) {
		this.def = def;
	}
	
	
}
package memento;
/*
 * 备忘录模式:
 *  在不破坏封装性的前提下,捕获一个对象的内部状态
 *  并在该对象之外保存这个状态 这样以后就可以将该对象恢复到原有保存的状态
 *  
 *  
 *  :
 *  发起人
 *  备忘录
 *  管理者
 */
public class Memento {
	public static void main(String[] args) {
		Role role = new Role();
		role.GetInitState();
		//展示信息
		role.Display();
		//备份
		RoleState roleState = role.RoleStateMemento();
		//战斗
		role.Fight();
		role.Display();
		
		//恢复
		
		role.RoleStateMemento(roleState);
		role.Display();
		
		/*
		 * 很明显这里的三个属性没有给调用者开放 
		 * 这样不管是备份还是恢复都很方便  
		 */
		
		
	}
}

class Role{
	//生命力
	private int vit;
	//***力
	private int atk;
	//防御力
	private int def;
	
	
	
	
	/*
	 * 保存游戏角色属性
	 */
	public RoleState RoleStateMemento(){
		return  new RoleState(vit,atk,def);
	}
	/*
	 * 恢复游戏角色
	 */
	public void RoleStateMemento(RoleState roleState ){
		this.vit = roleState.getVit();
		this.atk = roleState.getAtk();
		this.def = roleState.getDef();
	}
	/*
	 * 展示角色信息
	 */
	public void Display(){
		System.out.println("角色当前状态:");
		System.out.println("体力:"+vit);
		System.out.println("***力"+atk);
		System.out.println("防御力"+def);
	}

	/*
	 * 获得初始状态
	 */
	public void GetInitState(){
		this.vit = 100;
		this.atk = 100;
		this.def = 100;
	}
	
	/*
	 *战斗
	 */
	public void Fight(){
		this.vit = 0;
		this.atk = 0;
		this.def = 0;
	}

	public int getVit() {
		return vit;
	}

	public void setVit(int vit) {
		this.vit = vit;
	}

	public int getAtk() {
		return atk;
	}

	public void setAtk(int atk) {
		this.atk = atk;
	}

	public int getDef() {
		return def;
	}

	public void setDef(int def) {
		this.def = def;
	}
	
}


/*
 * 角色状态类(专门存角色的各种属性)
 */
class RoleState{
	public RoleState(int vit,int atk,int def){
		this.vit = vit;
		this.atk = atk;
		this.def = def;
	}
	//生命力
	private int vit;
	//***力
	private int atk;
	//防御力
	private int def;
	public int getVit() {
		return vit;
	}
	public void setVit(int vit) {
		this.vit = vit;
	}
	public int getAtk() {
		return atk;
	}
	public void setAtk(int atk) {
		this.atk = atk;
	}
	public int getDef() {
		return def;
	}
	public void setDef(int def) {
		this.def = def;
	}
	
}



上一篇:Laravel 5 基础(七)- Eloquent (laravel 的ORM)


下一篇:FB