• 设计模式(七)备忘录模式


    备忘录模式:用于保存对象的某个时刻的状态,以便在需要的时候恢复对象。

    第一步:创建Originator(愿生者):需要被保存的状态,即当前的状态

    public class Setting {
        private String oper;
        
        //创建一个版本
        public Version createVersion(){
            return new Version(oper);
        }
        
        //版本回退
        public void backVersion(Version version){
             this.oper = version.getSetting();
             System.out.println("----版本回退:" + oper);
        }
        //设置操作
        public void setOper(String oper) {
            System.out.println("当前操作:" + oper);
            this.oper = oper;
        }
        public String getOper() {
            return oper;
        }
    }

    第二步:创建Memento(备忘录):该对象是由Originator创建,用来保存Originator的内部状态(相当于一个镜像)

    public class Version {
        private String setting;
        
        public Version(String setting ) {
            this.setting = setting;
        }
        
        public String getSetting() {
            return setting;
        }
    }

    第三步:创建Caretaker(管理者):在适当的时候对恢复Originator对象的状态(回退)

    public class Caretaker  {
        //存储所有版本信息
        private Map<String,Version> versions = new HashMap<>();
        private List<String> verNums = new ArrayList<>();
        
        //保存一个版本
        public void addVersion(Version version){
            String verNum = UUID.randomUUID().toString().replace("-", "");
            verNums.add(verNum);
            versions.put(verNum, version);
        }
        
        //返回前一个版本
        public Version getVersion(){ 
    
            return versions.get(verNums.get(verNums.size() - 2));
        }
        
        //返回指定版本
        public Version getVersion(String verNum){
            return versions.get(verNum);
        }
        
        //显示所有版本号
        public void showVersions(){
            for(String num : verNums){
                System.out.println(num);
            }
                
        }
    }

    第四步:测试

    public class MainClass {
        public static void main(String[] args) {
            Caretaker caretaker = new Caretaker();
            Setting setting = new Setting();
            
            setting.setOper("开机");
            caretaker.addVersion(setting.createVersion());
            
            setting.setOper("关闭防火墙");
            caretaker.addVersion(setting.createVersion());
            
            setting.setOper("下载东西");
            caretaker.addVersion(setting.createVersion());
            
            setting.setOper("电脑中毒");
            caretaker.addVersion(setting.createVersion());
            
            //回退上一个版本
            setting.backVersion(caretaker.getVersion());
    
            System.out.println("所有版本号");
            //查看所有版本号
            caretaker.showVersions();
            
        }
    }

  • 相关阅读:
    c++ socket 出现绑定失败的一个特殊原因。Bind failed Error:10049
    解决OCX 在 非开发电脑上注册出错的问题
    JAVASCRIPT 调用 其他应用程序的方法
    JAVASCRIPT 调用 OCX 的那些坑
    关于socket通信bind()返回值错误:10049
    WPF LiveChart示例
    .NET Core 2.1 IIS 部署 出现500.19 错误
    文件上传大小限制
    winform httpclient 多文件上传
    VS Code中添加程序集安装包即添加DLL引用
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/7645822.html
Copyright © 2020-2023  润新知