デザインパターン - 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
|