您好,登錄后才能下訂單哦!
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 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); } }
在這個類中主要實現的核心功能就是記錄配置文件信息,也就是備忘錄的效果,之后提供可以回滾和獲取的方法,拿到備忘錄的具體內容。
同時這里設置了兩個數據結構來存放備忘錄,實際使用中可以按需設置。List<ConfigMemento>
、Map<String, ConfigMemento>
。
最后是提供的備忘錄操作方法;存放(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中函數式接口的作用是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。