Java设计模式-备忘录模式

本文介绍了一种使用备忘录模式在游戏开发中实现存档和读档功能的方法。通过创建存档类存储游戏状态,如关卡、回合数和背景音乐等信息,并利用存档操作类进行存档,玩家类则负责保存和载入这些存档。通过实例演示了如何在不同游戏进度中保存和读取存档。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

背景

人生没有后悔药,但是游戏有!机战有些关卡非常恶心,准确的说你会挂很多次,如果能够利用sl大法(s:存档 l:读档),再难过的坎都能过去!本章节将使用备忘录模式模拟SRW的存档读档。

实现

存档类:提供各种存档信息

/**
 * 存档:里面会有一些信息,为了简单起见,只列举几个比较有代表性的
 */
public class Record {

    // 第几关(话)
    private Integer chapterNumber;
    
    // 回合数
    private Integer roundCount;
    
    // bgm:在我的bgm下没有人可以战胜我
    private String bgm;
    
    public Record(Integer chapterNumber, Integer roundCount, String bgm) {
        super();
        this.chapterNumber = chapterNumber;
        this.roundCount = roundCount;
        this.bgm = bgm;
    }

    public Record() {
        super();
    }

    public Integer getChapterNumber() {
        return chapterNumber;
    }

    public void setChapterNumber(Integer chapterNumber) {
        this.chapterNumber = chapterNumber;
    }

    public Integer getRoundCount() {
        return roundCount;
    }

    public void setRoundCount(Integer roundCount) {
        this.roundCount = roundCount;
    }

    public String getBgm() {
        return bgm;
    }

    public void setBgm(String bgm) {
        this.bgm = bgm;
    }
    
    public void showRecord() {
        System.out.println("第" + chapterNumber + "关,第" + roundCount + "话,bgm是" + bgm);
    }

}

存档操作类:用来设置存档信息和保存存档

/**
 * 存档设置器
 */
public class RecordSetter {

    // 第几关(话)
    private Integer chapterNumber;

    // 回合数
    private Integer roundCount;

    // bgm:在我的bgm下没有人可以战胜我
    private String bgm;
    
    /**
     * 设置存档信息
     */
    public void setRecordMsg(Integer chapterNumber, Integer roundCount, String bgm) {
        this.chapterNumber = chapterNumber;
        this.roundCount = roundCount;
        this.bgm = bgm;
    }
    
    /**
     * 保存存档
     */
    public Record saveRecord() {
        return new Record(chapterNumber, roundCount, bgm);
    }
}

玩家类:能够保存/载入存档

/**
 * 当前玩家:可以读档和存档
 */
public class Player {
    
    // 存档记录:最高五个
    private List<Record> records = new ArrayList<>();
    

    public Player() {
        super();
        // 初始化存档记录
        for (int i=0; i<5; i++) {
            records.add(null);  // 空记录
        }
    }

    /**
     * 存档
     */
    public void save(int index, Record record) {
        System.out.println("存档到记录位" + (index+1) + "中");
        records.add(index, record);
    }
    
    /**
     * 读档
     */
    public void load(int index) {
        System.out.println("从记录位" + (index+1) + "中读档");
        Record record = records.get(index);
        if (null == record) {
            System.out.println("空存档");
        } else {
            record.showRecord();
        }
    }
    
}

测试类

public class MementoTest {

    public static void main(String[] args) {
        Player player = new Player();
        RecordSetter setter = new RecordSetter();
        
        // 现在是第2关,第10回合,bgm:钢铁的孤狼
        // 保存到存档位1
        setter.setRecordMsg(2, 10, "钢铁的孤狼");
        player.save(0, setter.saveRecord());
        
        // 顺利通关,现在是第3关,第2回合,bgm:堕落的白骑士
        // 保存到存档位2
        setter.setRecordMsg(3, 2, "堕落的白骑士");
        player.save(1, setter.saveRecord());
        
        // 顺利通关,现在是第5关,第4回合,bgm:钢之魂
        setter.setRecordMsg(5, 4, "钢之魂");
        // 保存到存档位5
        player.save(4, setter.saveRecord());
        
        System.out.println("我是分割线--------------------");
        
        // 读存档位2
        player.load(1);
        // 读存档位3
        player.load(2);
        // 读存档位5
        player.load(4);
    }
    
}

输出结果

存档到记录位1中
存档到记录位2中
存档到记录位5中
我是分割线--------------------
从记录位2中读档
第3关,第2回合,bgm是堕落的白骑士
从记录位3中读档
空存档
从记录位5中读档
第5关,第4回合,bgm是钢之魂
结论

没什么想说的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值