java中函数式接口的作用是什么

发布时间:2021-06-21 18:50:59 作者:Leah
来源:亿速云 阅读:533

java中函数式接口的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

开发环境

  1. JDK 1.8

  2. Idea + Maven

  3. 涉及工程一个,可以通过关注公众号bugstack虫洞栈,回复源码下载获取(打开获取的链接,找到序号18)

工程描述
itstack-demo-design-17-00开发配置文件备忘录

三、备忘录模式介绍

备忘录模式是以可以恢复或者说回滚,配置、版本、悔棋为核心功能的设计模式,而这种设计模式属于行为模式。在功能实现上是以不破坏原对象为基础增加备忘录操作类,记录原对象的行为从而实现备忘录模式。

这个设计在我们平常的生活或者开发中也是比较常见的,比如:后悔药、孟婆汤(一下回滚到0),IDEA编辑和撤销、小霸王游戏机存档。当然还有我们非常常见的Photoshop,如下;java中函数式接口的作用是什么cdn.segmentfault.com/v-5ef1b5ad/global/img/squares.svg">

四、案例场景模

在本案例中我们模拟系统在发布上线的过程中记录线上配置文件用于紧急回滚

在大型互联网公司系统的发布上线一定是易用、安全、可处理紧急状况的,同时为了可以隔离线上和本地环境,一般会把配置文件抽取出来放到线上,避免有人误操作导致本地的配置内容发布出去。同时线上的配置文件也会在每次变更的时候进行记录,包括;版本号、时间、MD5、内容信息和操作人。

在后续上线时如果发现紧急问题,系统就会需要回滚操作,如果执行回滚那么也可以设置配置文件是否回滚。因为每一个版本的系统可能会随着带着一些配置文件的信息,这个时候就可以很方便的让系统与配置文件一起回滚操作。

我们接下来就使用备忘录模式,模拟如何记录配置文件信息。实际的使用过程中还会将信息存放到库中进行保存,这里暂时只是使用内存记录。

五、备忘录模式记录配置文件版本信息

备忘录的设计模式实现方式,重点在于不更改原有类的基础上,增加备忘录类存放记录。可能平时虽然不一定非得按照这个设计模式的代码结构来实现自己的需求,但是对于功能上可能也完成过类似的功能,记录系统的信息。

除了现在的这个案例外,还可以是运营人员在后台erp创建活动对信息的记录,方便运营人员可以上下修改自己的版本,而不至于因为误操作而丢失信息。

1. 工程结构

itstack-demo-design-17-00└── src
    ├── main
    │   └── java
    │       └── org.itstack.demo.design
    │           ├── Admin.java
    │           ├── ConfigFile.java
    │           ├── ConfigMemento.java
    │           └── ConfigOriginator.java
    └── test
        └── java
            └── org.itstack.demo.design.test
                └── ApiTest.java

备忘录模式模型结构

2. 代码实现

2.1 配置信息类
public class ConfigFile {private String versionNo; // 版本号private String content;   // 内容private Date dateTime;    // 时间private String operator;  // 操作人// ...get/set}
2.2 备忘录类
public class ConfigMemento {private ConfigFile configFile;public ConfigMemento(ConfigFile configFile) {this.configFile = configFile;
    }public ConfigFile getConfigFile() {return configFile;
    }public void setConfigFile(ConfigFile configFile) {this.configFile = configFile;
    }
    
}
2.3 记录者类
public class ConfigOriginator {private ConfigFile configFile;public ConfigFile getConfigFile() {return configFile;
    }public void setConfigFile(ConfigFile configFile) {this.configFile = configFile;
    }public ConfigMemento saveMemento(){return new ConfigMemento(configFile);
    }public void getMemento(ConfigMemento memento){this.configFile = memento.getConfigFile();
    }

}
2.4 管理员类
public class Admin {private int cursorIdx = 0;private List<ConfigMemento> mementoList = new ArrayList<ConfigMemento>();private Map<String, ConfigMemento> mementoMap = new ConcurrentHashMap<String, ConfigMemento>();public void append(ConfigMemento memento) {
        mementoList.add(memento);
        mementoMap.put(memento.getConfigFile().getVersionNo(), memento);
        cursorIdx++;
    }public ConfigMemento undo() {if (--cursorIdx <= 0) return mementoList.get(0);return mementoList.get(cursorIdx);
    }public ConfigMemento redo() {if (++cursorIdx > mementoList.size()) return mementoList.get(mementoList.size() - 1);return mementoList.get(cursorIdx);
    }public ConfigMemento get(String versionNo){return mementoMap.get(versionNo);
    }

}

3. 测试验证

3.1 编写测试类
@Testpublic void test() {
    Admin admin = new Admin();
    ConfigOriginator configOriginator = new ConfigOriginator();
    configOriginator.setConfigFile(new ConfigFile("1000001", "配置内容A=哈哈", new Date(), "小傅哥"));
    admin.append(configOriginator.saveMemento()); // 保存配置configOriginator.setConfigFile(new ConfigFile("1000002", "配置内容A=嘻嘻", new Date(), "小傅哥"));
    admin.append(configOriginator.saveMemento()); // 保存配置configOriginator.setConfigFile(new ConfigFile("1000003", "配置内容A=么么", new Date(), "小傅哥"));
    admin.append(configOriginator.saveMemento()); // 保存配置configOriginator.setConfigFile(new ConfigFile("1000004", "配置内容A=嘿嘿", 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.redo());
    logger.info("历史配置(前进)redo:{}", JSON.toJSONString(configOriginator.getConfigFile()));   // 历史配置(获取)configOriginator.getMemento(admin.get("1000002"));
    logger.info("历史配置(获取)get:{}", JSON.toJSONString(configOriginator.getConfigFile()));
}
3.2 测试结果
23:12:09.512 [main] INFO  org.itstack.demo.design.test.ApiTest - 历史配置(回滚)undo:{"content":"配置内容A=嘿嘿","dateTime":159209829432,"operator":"小傅哥","versionNo":"1000004"}23:12:09.514 [main] INFO  org.itstack.demo.design.test.ApiTest - 历史配置(回滚)undo:{"content":"配置内容A=么么","dateTime":159209829432,"operator":"小傅哥","versionNo":"1000003"}23:12:09.514 [main] INFO  org.itstack.demo.design.test.ApiTest - 历史配置(前进)redo:{"content":"配置内容A=嘿嘿","dateTime":159209829432,"operator":"小傅哥","versionNo":"1000004"}23:12:09.514 [main] INFO  org.itstack.demo.design.test.ApiTest - 历史配置(获取)get:{"content":"配置内容A=嘻嘻","dateTime":159320989432,"operator":"小傅哥","versionNo":"1000002"}

Process finished with exit code 0

关于java中函数式接口的作用是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

推荐阅读:
  1. java中ee的作用是什么
  2. java中的反射是什么?有什么作用?

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Pandas 中有哪些描述统计函数

下一篇:如何正确的使用numpy.floor()函数

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》