IE盒子

搜索
查看: 157|回复: 1

Java常见设计模式之备忘录设计模式

[复制链接]

3

主题

14

帖子

29

积分

新手上路

Rank: 1

积分
29
发表于 2023-1-16 12:47:03 | 显示全部楼层 |阅读模式
释义

对某一对象的当前状态信息进行存档,可存档至内存也可持久化至磁盘。
类图



备忘录抽象类

public abstract class MemoAbstract {

    public String gameName;
    public String archiveName;
    public String gameState;

    public MemoAbstract(String gameName, String archiveName, String gameState) {
        this.gameName = gameName;
        this.archiveName = archiveName;
        this.gameState = gameState;
    }

    public String getGameName() {
        return gameName;
    }

    public void setGameName(String gameName) {
        this.gameName = gameName;
    }

    public String getArchiveName() {
        return archiveName;
    }

    public void setArchiveName(String archiveName) {
        this.archiveName = archiveName;
    }

    public String getGameState() {
        return gameState;
    }

    public void setGameState(String gameState) {
        this.gameState = gameState;
    }
}游戏抽象类

public abstract class GameAbstract {

    public String gameName;
    public String archiveName;
    public String gameState;

    public MemoAbstract memo;

    public GameAbstract(String gameName, String archiveName, String gameState) {
        this.gameName = gameName;
        this.archiveName = archiveName;
        this.gameState = gameState;
    }

    public abstract void saveArchive();
    public abstract GameAbstract getArchive(String gameName);

    public String getGameName() {
        return gameName;
    }

    public void setGameName(String gameName) {
        this.gameName = gameName;
    }

    public String getArchiveName() {
        return archiveName;
    }

    public void setArchiveName(String archiveName) {
        this.archiveName = archiveName;
    }

    public String getGameState() {
        return gameState;
    }

    public void setGameState(String gameState) {
        this.gameState = gameState;
    }
}备忘录子类

public class GTAMemo extends MemoAbstract {

    public GTAMemo(String gameName, String archiveName, String gameState) {
        super(gameName, archiveName, gameState);
    }
}游戏子类

public class GTAGame extends GameAbstract {

    public GTAGame(String gameName, String archiveName, String gameState) {
        super(gameName, archiveName, gameState);
    }

    @Override
    public void saveArchive() {
        this.memo = new GTAMemo(
                this.getGameName(),
                this.archiveName,
                this.getGameState()
        );
        MemoMaintainer.addMemoToMap(this.memo);
    }

    @Override
    public GameAbstract getArchive(String name) {
        this.memo = MemoMaintainer.getMemoFromMap(name);
        return new GTAGame(
                this.memo.getGameName(),
                this.memo.getArchiveName(),
                this.memo.getGameState()
        );
    }

    @Override
    public String toString() {
        return "GTAGame{" +
                "gameName='" + gameName + '\'' +
                ", archiveName='" + archiveName + '\'' +
                ", gameState='" + gameState + '\'' +
                '}';
    }
}备忘录维护者

public class MemoMaintainer {

    private static Map<String, MemoAbstract> memoMap = new HashMap<>();

    public static void addMemoToMap(MemoAbstract memo) {
        memoMap.put(memo.getGameName() + "-" + memo.getArchiveName(), memo);
    }

    public static MemoAbstract getMemoFromMap(String name) {
        return memoMap.get(name);
    }
}测试代码

public class TestMemo {

    public static void main(String[] args) {
        GTAGame gtaVc = new GTAGame("GTA_VC", "archiveFile_1", "侠盗猎车手-罪恶都市, 武器0, 血量100");
        //存档1
        gtaVc.saveArchive();
        System.out.println("The game msg is : " + gtaVc);

        gtaVc = new GTAGame("GTA_VC", "archiveFile_2" , "侠盗猎车手-罪恶都市, 武器10, 血量90");
        //存档2
        gtaVc.saveArchive();
        System.out.println("The game msg is : " + gtaVc);

        gtaVc = new GTAGame("GTA_VC", "archiveFile_3", "侠盗猎车手-罪恶都市, 武器50, 血量20");
        //存档3
        gtaVc.saveArchive();
        System.out.println("The game msg is : " + gtaVc);

        //读取存档2
        gtaVc = (GTAGame) gtaVc.getArchive("GTA_VC" + "-" + "archiveFile_2");
        System.out.println("The archive game msg is : " + gtaVc);

    }
}测试结果




欢迎留言交流,欢迎转载,转载请注明出处即可,谢谢大家。。。
回复

使用道具 举报

1

主题

13

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2025-6-8 00:28:50 | 显示全部楼层
楼猪V5啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表