📄 q_memento.java
字号:
/*
MEMENTO—同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。
备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
Memento模式在Jsp+Javabean中的应用
在Jsp应用中,我们通常有很多表单要求用户输入,比如用户注册,需要输入姓名和Email等, 如果一些表项用户没有填写或者填写错误,我们希望在用户按"提交Submit"后,通过Jsp程序检查,发现确实有未填写项目,则在该项目下红字显示警告或错误,同时,还要显示用户刚才已经输入的表项.
*/
import java.util.*;
public class Q_Memento{
public static void main(String args[]){
Gamer gamer = new Gamer(100); // 一开始手边金钱总额为100
Memento memento = gamer.createMemento(); // 预先储存最初状态
for (int i = 0; i < 100; i++) {
System.out.println("==== " + i); // 输出次数
System.out.println("现况:" + gamer); // 输出主人的目前状态
gamer.bet(); // 进行游戏
System.out.println("手边金钱总额为" + gamer.getMoney() + "元。");
// 决定如何处理Memento
if (gamer.getMoney() > memento.getMoney()) {
System.out.println(" (因为已经贏了不少,故先储存目前状态)");
memento = gamer.createMemento();
} else if (gamer.getMoney() < memento.getMoney() / 2) {
System.out.println(" (因为已经输了很多,故恢复到原先状态)");
gamer.restoreMemento(memento);
}
// 等候
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println("");
}
}
}
class Gamer {
private int money; // 手边金钱总额
private Vector fruits = new Vector(); // 水果
private Random random = new Random(); // 随机数生成器
private static String[] fruitsname = { // 水果名称一览表
"蘋果", "葡萄", "香蕉", "橘子",
};
public Gamer(int money) { // 构造子
this.money = money;
}
public int getMoney() { // 取得目前的手边金钱总额
return money;
}
public void bet() { // 下注…开始游戏
int dice = random.nextInt(6) + 1; // 掷骰子
if (dice == 1) { // 第1次…手边金钱有变多
money += 100;
System.out.println("手边金钱增加了。");
} else if (dice == 2) { // 第2次…手边金钱剩一半
money /= 2;
System.out.println("手边金钱剩一半。");
} else if (dice == 6) { // 第6次…得到水果
String f = getFruit();
System.out.println("得到水果(" + f + ")。");
fruits.add(f);
} else { // 其他…沒有发生什么事
System.out.println("沒有发生什么事。");
}
}
public Memento createMemento() { // 快照(snapshot)
Memento m = new Memento(money);
Iterator it = fruits.iterator();
while (it.hasNext()) {
String f = (String)it.next();
if (f.startsWith("好吃的")) { // 只储存好吃的水果
m.addFruit(f);
}
}
return m;
}
public void restoreMemento(Memento memento) { // 进行复原
this.money = memento.money;
this.fruits = memento.getFruits();
}
public String toString() { // 输出成字串
return "[money = " + money + ", fruits = " + fruits + "]";
}
private String getFruit() { // 得到1個水果
String prefix = "";
if (random.nextBoolean()) {
prefix = "好吃的";
}
return prefix + fruitsname[random.nextInt(fruitsname.length)];
}
}
class Memento {
int money; // 手边金钱总额
Vector fruits; // 水果
public int getMoney() { // 取得手边金钱总额(narrow interface)
return money;
}
Memento(int money) { // 构造子(wide interface)
this.money = money;
this.fruits = new Vector();
}
void addFruit(String fruit) { // 新增水果(wide interface)
fruits.add(fruit);
}
Vector getFruits() {
return (Vector)fruits.clone();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -