liguofeng29’s blog

個人勉強用ブログだっす。

デザインパターン - Memento

【Mementoパターンとは】

オブジェクトの状態保存し、その状態に戻せる。

 

Mementoパターンのクラス図】

 

Mementoパターンのメリット】

オブジェクトの状態保存し、その状態に戻せる。

 

【サンプル】

 
Memento.java
package memento;
 
// Playerの状態を保存するmemento
public class Memento {
public int HP;
public int level;
 
public Memento(int HP, int level) {
this.HP = HP;
this.level = level;
}
}
 
 
 
 

Player.java
package memento;
 
public class Player {
 
// 体力
private int HP;
// レベル
private int level;
 
public int getHP() {
return HP;
}
 
public void setHP(int HP) {
this.HP = HP;
}
 
public int getLevel() {
return level;
}
 
public void setLevel(int level) {
this.level = level;
}
 
public Player(int HP, int level) {
System.out.println("プレイシャーが生成されました。");
this.HP = HP;
this.level = level;
 
this.showInfo();
}
 
public void beAttacked(int damage) {
System.out.println("ダメージを" + damage + "受けました。");
 
HP -= damage;
 
if (HP <= 0) {
System.out.println("プレイヤー死んだ!");
}
}
 
// save
public Memento createMemento() {
System.out.println("saveしました。");
 
return new Memento(this.HP, this.level);
}
 
// load
public void setMemento(Memento m) {
 
System.out.println("loadしました。");
 
this.HP = m.HP;
this.level = m.level;
}
 
public void showInfo() {
System.out.println("現在の体力 : " + this.HP);
System.out.println("現在のレベル : " + this.level);
}
}
 
 

MementoTest.java
package memento;
 
import java.util.HashMap;
import java.util.Map;
 
public class MementoTest {
 
/**
* @param args
*/
public static void main(String[] args) {
// HP:200 level:1
Player player = new Player(200, 1);
 
Map<String, Memento> saveMap = new HashMap<String, Memento>();
 
// 始める前に保存
saveMap.put("1", player.createMemento());
 
// プレイ
System.out.println("モンスターと戦います。");
 
for (int i = 0; i < 3; i++) {
// 3回 1から9のダメージを受ける
int damage = (int) (Math.random() * 20);
 
player.beAttacked(damage);
}
 
player.showInfo();
 
// 体力が9割以下ならリロード
if (player.getHP() < 200 * 0.90) {
System.out.println("体力が9割以下になりました。");
player.setMemento(saveMap.get("1"));
}
 
player.showInfo();
 
}
 
}
 
 
 
 

実行結果
プレイシャーが生成されました。
現在の体力 : 200
現在のレベル : 1
saveしました。
モンスターと戦います。
ダメージを10受けました。
ダメージを7受けました。
ダメージを16受けました。
現在の体力 : 167
現在のレベル : 1
体力が9割以下になりました。
loadしました。
現在の体力 : 200
現在のレベル : 1