设计模式——备忘录模式18

本文介绍了Java中的备忘录模式,通过Originator对象创建并管理LogFile对象的状态快照,实现了对文件数据的备份和版本控制。Memento类封装了原始文件信息,管理员(Administrator)负责存储和恢复这些快照。
摘要由CSDN通过智能技术生成

备忘录模式将创建状态快照 /备份的工作委派给实际状态的拥有者 (Originator) 对象。 这样其他对象就不再需要从 “外部” 复制文件状态了, 拥有者拥有其文件状态的完全访问权, 因此可以自行生成快照。
设计模式,一定要敲代码理解
在这里插入图片描述

文件信息( 需备份的源对象)

/**
 * @author ggbond
 * @date 2024年04月16日 08:38
 */
public class LogFile {
    private  String name;
    private  int size;
    private Date time;
    private int version;

    public LogFile(String name, int size, Date time, int version) {
        this.name = name;
        this.size = size;
        this.time = time;
        this.version = version;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

    @Override
    public String toString() {
        return "LogFile{" +
                "name='" + name + '\'' +
                ", size=" + size +
                ", time=" + time +
                ", version=" + version +
                '}';
    }
}

备忘录(对备份源文件进行封装扩展)

/**
 * @author ggbond
 * @date 2024年04月16日 08:40
 * 备忘录类,在源数据LogFile进行封装扩展,也称快照信息。。
 */
public class Memento {
    private LogFile logFile;

    public Memento(LogFile logFile) {
        this.logFile = logFile;
    }

    public LogFile getLogFile() {
        return logFile;
    }

    public void setLogFile(LogFile logFile) {
        this.logFile = logFile;
    }
}

拥有者/操作员

/**
 * @author ggbond
 * @date 2024年04月16日 08:42
 *  记录操作者, 能对记录获取与修改的同时,进行记录保存为快照与依据快照进行进行恢复数据
 */
public class Originator {
    private  LogFile logFile;

    public LogFile getLogFile() {
        return logFile;
    }

    public void setLogFile(LogFile logFile) {
        this.logFile = logFile;
    }

    //保存为快照
    public Memento save(){
        return  new Memento(logFile);
    }
    //依据快照恢复现在操作的文件
    public void getMemento(Memento memento) {
        this.logFile=memento.getLogFile();
    }
}

管理员(版本控制)

/**
 * @author ggbond
 * @date 2024年04月16日 08:52
 */
public class Administrator {
    private int cursor=0;//游标 版本指针
    private Map<Integer, Memento> map=new HashMap<>();

    private List<Memento> list=new ArrayList<>();

测试与结果

/**
 * @author ggbond
 * @date 2024年04月16日 09:23
 */
public class Main {
    public static void main(String[] args) {
        //记录操作者
        Originator originator=new Originator();
        originator.setLogFile(new LogFile("file_ggbond1",30,new Date(),1));
        //备份中心
        Administrator administrator=new Administrator();
        administrator.add(originator.save());//备份

        originator.setLogFile(new LogFile("file_ggbond2",31,new Date(),2));
        administrator.add(originator.save());//备份

        originator.setLogFile(new LogFile("file_ggbond3",33,new Date(),3));
        administrator.add(originator.save());//备份

        //回滚
        originator.getMemento(administrator.undo());
        System.out.println(originator.getLogFile().toString());

        //再回滚
        originator.getMemento(administrator.undo());
        System.out.println(originator.getLogFile().toString());
        //再回滚
        originator.getMemento(administrator.undo());
        System.out.println(originator.getLogFile().toString());

        //前进版本
        originator.getMemento(administrator.redo());
        System.out.println(originator.getLogFile().toString());

    }
}
LogFile{name='file_ggbond3', size=33, time=Tue Apr 16 09:35:53 CST 2024, version=3}
LogFile{name='file_ggbond2', size=31, time=Tue Apr 16 09:35:53 CST 2024, version=2}
LogFile{name='file_ggbond1', size=30, time=Tue Apr 16 09:35:53 CST 2024, version=1}
LogFile{name='file_ggbond2', size=31, time=Tue Apr 16 09:35:53 CST 2024, version=2}

总结

可以在不破坏对象封装情况的前提下创建对象状态快照。实用性偏弱,数据不会保存在内存而是数据库。

代码下载

代码下载

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值