您当前的位置: 首页 > 

java持续实践

暂无认证

  • 2浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

设计模式 备忘录模式

java持续实践 发布时间:2022-03-31 22:24:30 ,浏览量:2

备忘录模式

使用备忘录模式的情景: 一般用于版本的回退, 页面上临时配置的回退等操作.

备忘录模式实战

模拟记录各个版本配置信息, 并实现配置的回退, 前进等操作.

uml图如下 配置信息类

@AllArgsConstructor
@NoArgsConstructor
@Data
public class ConfigFile {

    // 版本号
    private String versionNo;
    // 内容
    private String content;
    // 时间
    private Date dateTime;
    // 操作人
    private String operator;
}

备忘录类

/**
 * 类名称:ConfigMemento
 * 备忘录类
 * 创建时间:2022/3/31 20:15
 * 对原有配置类的扩展,可以设置和获取配置信息。
 */
@Data
public class ConfigMemento {

    private ConfigFile configFile;
    
    public ConfigMemento(ConfigFile configFile) {
        this.configFile = configFile;
    }
}

记录者类

@Data
public class ConfigOriginator {

    private ConfigFile configFile;

    public ConfigMemento saveMemento() {
        // 保存备忘录的时候会创建一个备忘录信息,并返回回去,交给管理者处理。
        return new ConfigMemento(configFile);
    }

    public void getMemento(ConfigMemento memento) {
        // 把备忘录的信息交给现在的配置文件
        this.configFile = memento.getConfigFile();
    }
}

管理员类 Admin 实现数据的回滚 存放 等操作.

public class Admin {

    private int cursorIdx = 0;
    private List mementoList = new ArrayList();
    private Map mementoMap = new ConcurrentHashMap();

    // 存放
    public void append(ConfigMemento memento) {
        mementoList.add(memento);
        mementoMap.put(memento.getConfigFile().getVersionNo(), memento);
        // 每加一次 游标加一
        cursorIdx++;
    }

    // 回滚
    public ConfigMemento undo() {
        if ( --cursorIdx  mementoList.size()) return mementoList.get(mementoList.size() - 1);
        return mementoList.get(cursorIdx);
    }

    //定向获取
    public ConfigMemento get(String versionNo) {
        return mementoMap.get(versionNo);
    }
}

测试类:

import com.alibaba.fastjson.JSON;
import com.thc.design.Admin;
import com.thc.design.ConfigFile;
import com.thc.design.ConfigOriginator;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

/**
 * 类名称:ApiTest
 * 创建时间:2022/3/31 20:44
 */
public class ApiTest {

    private Logger logger = LoggerFactory.getLogger(ApiTest.class);

    @Test
    public void test() {
        Admin admin = new Admin();
        ConfigOriginator configOriginator = new ConfigOriginator();

        configOriginator.setConfigFile(new ConfigFile("1000001", "配置内容A1", new Date(), "搬砖工"));
        // 保存配置
        admin.append(configOriginator.saveMemento());

        configOriginator.setConfigFile(new ConfigFile("1000002", "配置内容A2", new Date(), "搬砖工"));
        admin.append(configOriginator.saveMemento());

        configOriginator.setConfigFile(new ConfigFile("1000003", "配置内容A3", new Date(), "搬砖工"));
        admin.append(configOriginator.saveMemento());

        configOriginator.setConfigFile(new ConfigFile("1000004", "配置内容A4", new Date(), "搬砖工"));
        admin.append(configOriginator.saveMemento());

        // 历史配置 回滚
        configOriginator.getMemento(admin.undo());
        logger.info("历史配置(回滚) undo: {}", JSON.toJSONString(configOriginator.getConfigFile()));

        // 历史配置回滚
        configOriginator.getMemento(admin.undo());
        logger.info("历史配置回滚 undo: {}", JSON.toJSONString(configOriginator.getConfigFile()));
        configOriginator.getMemento(admin.undo());
        logger.info("历史配置回滚 undo: {}", JSON.toJSONString(configOriginator.getConfigFile()));
        configOriginator.getMemento(admin.undo());
        logger.info("历史配置回滚 undo: {}", JSON.toJSONString(configOriginator.getConfigFile()));

        // 历史配置 前进
        configOriginator.getMemento(admin.redo());
        logger.info("历史配置前进 redo:{}", JSON.toJSONString(configOriginator.getConfigFile()));

        // 历史配置 直接获取
        configOriginator.getMemento(admin.get("1000002"));
        logger.info("历史配置(获取) get:{}", JSON.toJSONString(configOriginator.getConfigFile()));
    }
}

控制台打印如下 . 对备忘录进行回滚, 前进 以及直接获取等操作.

22:21:38.999 [main] INFO  com.thc.design.test.ApiTest - 历史配置(回滚) undo: {"content":"配置内容A3","dateTime":1648736498880,"operator":"搬砖工","versionNo":"1000003"}
22:21:39.003 [main] INFO  com.thc.design.test.ApiTest - 历史配置回滚 undo: {"content":"配置内容A2","dateTime":1648736498880,"operator":"搬砖工","versionNo":"1000002"}
22:21:39.003 [main] INFO  com.thc.design.test.ApiTest - 历史配置回滚 undo: {"content":"配置内容A1","dateTime":1648736498879,"operator":"搬砖工","versionNo":"1000001"}
22:22:07.998 [main] INFO  com.thc.design.test.ApiTest - 历史配置回滚 undo: {"content":"配置内容A1","dateTime":1648736498879,"operator":"搬砖工","versionNo":"1000001"}
22:22:07.998 [main] INFO  com.thc.design.test.ApiTest - 历史配置前进 redo:{"content":"配置内容A1","dateTime":1648736498879,"operator":"搬砖工","versionNo":"1000001"}
22:22:07.999 [main] INFO  com.thc.design.test.ApiTest - 历史配置(获取) get:{"content":"配置内容A2","dateTime":1648736498880,"operator":"搬砖工","versionNo":"1000002"}
关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0405s