重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
java中函数式接口的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
成都创新互联公司网站建设公司一直秉承“诚信做人,踏实做事”的原则,不欺瞒客户,是我们最起码的底线! 以服务为基础,以质量求生存,以技术求发展,成交一个客户多一个朋友!专注中小微企业官网定制,网站设计、做网站,塑造企业网络形象打造互联网企业效应。
开发环境
JDK 1.8
Idea + Maven
涉及工程一个,可以通过关注公众号:bugstack虫洞栈
,回复源码下载
获取(打开获取的链接,找到序号18)
工程 | 描述 |
---|---|
itstack-demo-design-17-00 | 开发配置文件备忘录 |
备忘录模式是以可以恢复或者说回滚,配置、版本、悔棋为核心功能的设计模式,而这种设计模式属于行为模式。在功能实现上是以不破坏原对象为基础增加备忘录操作类,记录原对象的行为从而实现备忘录模式。
这个设计在我们平常的生活或者开发中也是比较常见的,比如:后悔药、孟婆汤(一下回滚到0),IDEA编辑和撤销、小霸王游戏机存档。当然还有我们非常常见的Photoshop,如下;cdn.segmentfault.com/v-5ef1b5ad/global/img/squares.svg">
在本案例中我们模拟系统在发布上线的过程中记录线上配置文件用于紧急回滚
在大型互联网公司系统的发布上线一定是易用、安全、可处理紧急状况的,同时为了可以隔离线上和本地环境,一般会把配置文件抽取出来放到线上,避免有人误操作导致本地的配置内容发布出去。同时线上的配置文件也会在每次变更的时候进行记录,包括;版本号、时间、MD5、内容信息和操作人。
在后续上线时如果发现紧急问题,系统就会需要回滚操作,如果执行回滚那么也可以设置配置文件是否回滚。因为每一个版本的系统可能会随着带着一些配置文件的信息,这个时候就可以很方便的让系统与配置文件一起回滚操作。
我们接下来就使用备忘录模式,模拟如何记录配置文件信息。实际的使用过程中还会将信息存放到库中进行保存,这里暂时只是使用内存记录。
备忘录的设计模式实现方式,重点在于不更改原有类的基础上,增加备忘录类存放记录。可能平时虽然不一定非得按照这个设计模式的代码结构来实现自己的需求,但是对于功能上可能也完成过类似的功能,记录系统的信息。
除了现在的这个案例外,还可以是运营人员在后台erp创建活动对信息的记录,方便运营人员可以上下修改自己的版本,而不至于因为误操作而丢失信息。
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
备忘录模式模型结构
以上是工程结构的一个类图,其实相对来说并不复杂,除了原有的配置类(ConfigFile
)以外,只新增加了三个类。
ConfigMemento
:备忘录类,相当于是对原有配置类的扩展三门峡妇科医院http://www.smxrlyy.com/
ConfigOriginator
:记录者类,获取和返回备忘录类对象信息
Admin
:管理员类,用于操作记录备忘信息,比如你一些列的顺序执行了什么或者某个版本下的内容信息
public class ConfigFile {private String versionNo; // 版本号private String content; // 内容private Date dateTime; // 时间private String operator; // 操作人// ...get/set}
配置类可以是任何形式的,这里只是简单的描述了一个基本的配置内容信息。
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; } }
备忘录是对原有配置类的扩展,可以设置和获取配置信息。
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(); } }
记录者类除了对ConfigFile
配置类增加了获取和设置方法外,还增加了保存saveMemento()
、获取getMemento(ConfigMemento memento)
。
saveMemento
:保存备忘录的时候会创建一个备忘录信息,并返回回去,交给管理者处理。
getMemento
:获取的之后并不是直接返回,而是把备忘录的信息交给现在的配置文件this.configFile
,这部分需要注意。
public class Admin {private int cursorIdx = 0;private ListmementoList = 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 <= 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); } }
在这个类中主要实现的核心功能就是记录配置文件信息,也就是备忘录的效果,之后提供可以回滚和获取的方法,拿到备忘录的具体内容。
同时这里设置了两个数据结构来存放备忘录,实际使用中可以按需设置。List
、Map
。
最后是提供的备忘录操作方法;存放(append
)、回滚(undo
)、返回(redo
)、定向获取(get
),这样四个操作方法。
@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())); }
这个设计模式的学习有一部分重点是体现在了单元测试类上,这里包括了四次的信息存储和备忘录历史配置操作。
通过上面添加了四次配置后,下面分别进行操作是;回滚1次
、再回滚1次
,之后向前进1次
,最后是获取指定的版本配置
。具体的效果可以参考测试结果。
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中函数式接口的作用是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。