【设计模式】通过游戏存档了解备忘录模式

开发 前端
本文通过游戏的存档、回退存档,抽象出与符合的设计模式——备忘录模式。同时,与传统Java的说教不同,本次的实现基于企业开发必用的Spring框架,贴近实际开发场景。

背景

你(Caretaker)在玩一个游戏,可以对游戏进行存档(Memento),以便后面遇到不符合预期的游戏场景,通过存档管理(Originator)恢复。

模式定义

Without violating encapsulation,capture and externalize an object's internal state so that the object can be restored to this state later.

在不违反封装的情况下,捕获并外部化对象的内部状态,以便以后可以将对象恢复到该状态。

模式结构

模式实现

1.定义游戏状态类

package com.example.designpattern.memento.domain;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 游戏状态
 *
 * @author hongcunlin
 */
@Data
@AllArgsConstructor
public class GameState {
    /**
     * 经验值
     */
    private int exp;

    /**
     * 等级
     */
    private int level;

    /**
     * 存档
     *
     * @return 存档
     */
    public GameMemento save() {
        return new GameMemento(exp, level);
    }

    /**
     * 加载存档
     *
     * @param gameMemento 存档
     */
    public void restore(GameMemento gameMemento) {
        exp = gameMemento.getExp();
        level = gameMemento.getLevel();
    }
}

2.定义游戏存档类

package com.example.designpattern.memento.domain;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 游戏存档
 *
 * @author hongcunlin
 */
@Data
@AllArgsConstructor
public class GameMemento {
    /**
     * 经验值
     */
    private int exp;

    /**
     * 等级
     */
    private int level;
}

3.定义游戏存档管理接口

package com.example.designpattern.memento.manager;

import com.example.designpattern.memento.domain.GameMemento;

/**
 * 游戏存档管理
 *
 * @author hongcunlin
 */
public interface GameSaveManger {
    /**
     * 保持存档
     *
     * @param memento 存档
     */
    void addSave(GameMemento memento);

    /**
     * 获取存档
     *
     * @param index 索引
     * @return 存档
     */
    GameMemento getSave(int index);
}

4.实现游戏存档管理接口

package com.example.designpattern.memento.manager.impl;

import com.example.designpattern.memento.domain.GameMemento;
import com.example.designpattern.memento.manager.GameSaveManger;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 游戏管理
 *
 * @author hongcunlin
 */
@Component("gameSaveManger")
public class GameSaveMangerImpl implements GameSaveManger {
    /**
     * 存档列表
     */
    private final List<GameMemento> saves = new ArrayList<>();

    /**
     * 保持存档
     *
     * @param memento 存档
     */
    @Override
    public void addSave(GameMemento memento) {
        saves.add(memento);
    }

    /**
     * 获取存档
     *
     * @param index 索引
     * @return 存档
     */
    @Override
    public GameMemento getSave(int index) {
        return saves.get(index);
    }
}

5.测试

package com.example.designpattern.memento;

import com.example.designpattern.memento.domain.GameState;
import com.example.designpattern.memento.manager.GameSaveManger;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

/**
 * 备忘录模式测试
 *
 * @author hongcunlin
 */
@SpringBootTest
public class DesignPatternTest {
    /**
     * 游戏存档管理
     */
    @Resource(name = "gameSaveManger")
    private GameSaveManger gameSaveManger;

    @Test
    public void test() {
        // 开始游戏
        GameState gameState = new GameState(1, 1);

        // 存档游戏
        gameSaveManger.addSave(gameState.save());

        // 玩游戏
        gameState.setExp(2);
        gameState.setLevel(2);

        // 加载存档
        gameState.restore(gameSaveManger.getSave(0));
        System.out.println(gameState);
    }
}

可以看到,游戏是可以正常会退到存档的内容的

回顾

本文通过游戏的存档、回退存档,抽象出与符合的设计模式——备忘录模式。同时,与传统Java的说教不同,本次的实现基于企业开发必用的Spring框架,贴近实际开发场景。

不过备忘录模式在实际开发中的应用并不多,很少有数据存储在服务器容器运行的内存中,而是会将数据存储到专门的数据库中,如磁盘型数据库MySQL,内存型数据库Redis等。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2020-11-02 10:41:33

备忘录模式

2023-10-31 09:07:16

备忘录模式保存

2023-04-19 08:03:52

Go设计模式

2018-12-24 21:40:12

2023-10-10 15:26:30

内存泄露OOM

2014-04-17 10:30:41

Linux 命令黑白备忘录

2017-03-21 11:02:59

基础深度学习备忘录

2011-04-11 10:03:32

钱伯斯思科

2011-08-16 18:38:23

Core Animat动画

2023-09-26 00:27:07

设计模式链接

2018-06-20 13:14:16

MySQL数据优化查询备忘录

2013-08-29 10:50:48

移动网站性能优化移动web

2016-03-03 10:09:26

2021-03-08 00:12:44

Grid 备忘录 函数

2011-12-07 09:19:49

JavaJ2MEBicaVM

2023-10-07 00:17:06

AirDrop中介者模式

2022-04-07 08:00:00

Javascript开发

2009-06-17 16:54:27

MySpace备忘录裁员

2009-08-14 15:50:45

C#正则表达式

2011-08-31 10:34:47

JavaJava备忘录
点赞
收藏

51CTO技术栈公众号