400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

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

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 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 <= 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中函数式接口的作用是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


分享标题:java中函数式接口的作用是什么
分享链接:http://mzwzsj.com/article/gdggdh.html

其他资讯

让你的专属顾问为你服务