⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 q_memento.java

📁 超好的设计模式Java事例程序
💻 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 + -