本篇內(nèi)容主要講解“java備忘錄模式怎么實現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java備忘錄模式怎么實現(xiàn)”吧!
創(chuàng)新互聯(lián)建站成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供網(wǎng)站制作、成都做網(wǎng)站網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計,成都響應(yīng)式網(wǎng)站建設(shè)公司,網(wǎng)頁設(shè)計師打造企業(yè)風格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:028-86922220
備忘錄模式又稱為快照模式或令牌模式,屬于行為型模式。
它是指在不破壞封裝的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到原先保存的狀態(tài)。簡而言之:允許在不暴露對象實現(xiàn)細節(jié)的情況下保存和恢復對象之前的狀態(tài)。
它提供一種類似“后悔藥”的機制,通過存儲系統(tǒng)各個歷史狀態(tài)的快照,使得可以在任一時刻將系統(tǒng)回滾到某一個歷史狀態(tài)。
1.需要保存歷史快照的場景 2.希望在對象之外保存狀態(tài),且除了自己其他類對象無法訪問狀態(tài)保存具體內(nèi)容
應(yīng)用場景舉例:代碼版本控制,游戲存檔功能,數(shù)據(jù)庫的事務(wù)管理等
假如有一款編輯器應(yīng)用程序,程序在執(zhí)行任何操作前記錄所有的對象狀態(tài), 并將其保存下來。 當用戶此后需要撤銷某個操作時, 程序?qū)臍v史記錄中獲取最近的快照, 然后使用它來恢復所有對象的狀態(tài)。
優(yōu)點:
1.簡化發(fā)起人實體類Originator職責,隔離狀態(tài)存儲與獲取,實現(xiàn)了信息的封裝,客戶端無需關(guān)心狀態(tài)的保存細節(jié) 2.提供狀態(tài)回滾功能:給用戶提供了一種可以恢復狀態(tài)的機制,可以使用戶能夠比較方便地回到某個歷史的狀態(tài)。
缺點:
1.消耗資源:如果需要保存的狀態(tài)過多時,每一次保存都會消耗很多內(nèi)存。
備忘錄模式主要包含三種角色:
1.發(fā)起人角色(Originator)
負責創(chuàng)建一個備忘錄,記錄自身需要保存的狀態(tài);具備狀態(tài)回滾功能。
2.備忘錄角色(Memento)
用于存儲Originator的內(nèi)部狀態(tài),且可以防止Originator以外的對象進行訪問。
3.備忘錄管理員角色(Caretaker)
負責存儲,提供管理備忘錄(Memento),無法對備忘錄內(nèi)容進行操作和訪問。
備忘錄模式本質(zhì)是從發(fā)起人實體類(Originator)隔離存儲功能,降低實體類的職責。同時由于存儲信息(Memento)獨立,且存儲信息的實體交由管理類(Caretaker)管理,則可以通過為管理類擴展額外的功能對存儲信息進行擴展操作。
@Data public class Memento { private String state; public Memento(String state){ this.state = state; } }
@Data public class Originator { /** * 內(nèi)部狀態(tài) */ private String state; /** * 創(chuàng)建一個備忘錄 * * @return */ public Memento createMemento() { return new Memento(this.state); } /** * 從備忘錄恢復 * * @param memento */ public void restoreMemento(Memento memento) { this.setState(memento.getState()); } }
public class Caretaker { private Memento memento; public Memento getMemento() { return this.memento; } public void storeMemento(Memento memento) { this.memento = memento; } }
public static void main(String[] args) { // 創(chuàng)建發(fā)起人角色 Originator originator = new Originator(); // 創(chuàng)建備忘錄管理員 Caretaker caretaker = new Caretaker(); // 設(shè)置存儲狀態(tài) originator.setState("A"); // 存儲發(fā)起人創(chuàng)建的備忘錄 caretaker.storeMemento(originator.createMemento()); System.out.println("設(shè)置存儲狀態(tài):" + originator.getState()); // 設(shè)置存儲狀態(tài) originator.setState("B"); System.out.println("更新存儲狀態(tài):" + originator.getState()); // 備忘錄進行回滾 originator.restoreMemento(caretaker.getMemento()); System.out.println("回滾到設(shè)置的狀態(tài):" + originator.getState()); }
設(shè)置存儲狀態(tài):A 更新存儲狀態(tài):B 回滾到設(shè)置的狀態(tài):A
@Data @ToString public class CodeMemento { /** * 提交內(nèi)容 */ private String content; /** * 提交備注 */ private String remark; public CodeMemento(String content, String remark) { this.content = content; this.remark = remark; } }
@Data @ToString public class GitOriginator { /** * 提交內(nèi)容 */ private String content; /** * 提交備注 */ private String remark; public GitOriginator(String content, String remark) { this.content = content; this.remark = remark; } /** * 提交代碼 * * @return */ public CodeMemento saveToMemento() { CodeMemento codeMemento = new CodeMemento(this.content, this.remark); return codeMemento; } /** * 恢復代碼 * * @param codeMemento */ public void undoFromMemento(CodeMemento codeMemento) { this.content = codeMemento.getContent(); this.remark = codeMemento.getRemark(); } }
public class GitCaretaker { /** * 使用棧來存儲備忘錄,最新的備忘錄排在棧頂 */ private final Stack<CodeMemento> STACK = new Stack<CodeMemento>(); public CodeMemento getMemento(){ // 移除棧頂?shù)膫渫? CodeMemento codeMemento = STACK.pop(); return codeMemento; } public void addMemento(CodeMemento codeMemento){ // 將備忘錄壓入棧頂 STACK.push(codeMemento); } }
public static void main(String[] args) { System.out.println("--------------------第一次創(chuàng)建代碼--------------------------------"); // 創(chuàng)建一個備忘錄管理者 GitCaretaker gitCaretaker = new GitCaretaker(); // 創(chuàng)建一個備忘錄發(fā)起人 GitOriginator gitOriginator = new GitOriginator("write code 1", "第一次提交代碼備注"); // 創(chuàng)建一個備忘錄 CodeMemento codeMemento = gitOriginator.saveToMemento(); // 將備忘錄壓入棧頂 gitCaretaker.addMemento(codeMemento); System.out.println("第一次提交代碼完成。代碼:" + gitOriginator.getContent() + " 備注:" + gitOriginator.getRemark()); System.out.println("--------------------第二次修改代碼--------------------------------"); gitOriginator.setContent("write code 2"); gitOriginator.setRemark("第二次提交代碼備注"); codeMemento = gitOriginator.saveToMemento(); gitCaretaker.addMemento(codeMemento); System.out.println("第二次提交代碼完成。代碼:" + gitOriginator.getContent() + " 備注:" + gitOriginator.getRemark()); System.out.println("--------------------第三次修改代碼--------------------------------"); gitOriginator.setContent("write code 3"); System.out.println("第三次修改代碼。代碼:" + gitOriginator.getContent()); System.out.println("--------------------在第三次修改代碼基礎(chǔ)上回退到第二次提交--------------------------------"); codeMemento = gitCaretaker.getMemento(); gitOriginator.undoFromMemento(codeMemento); System.out.println("回退到第二次提交完成。代碼:" + gitOriginator.getContent() + " 備注:" + gitOriginator.getRemark()); System.out.println("--------------------在第二次修改代碼基礎(chǔ)上回退到第一次提交--------------------------------"); codeMemento = gitCaretaker.getMemento(); gitOriginator.undoFromMemento(codeMemento); System.out.println("回退到第一次提交完成。代碼:" + gitOriginator.getContent() + " 備注:" + gitOriginator.getRemark()); }
--------------------第一次創(chuàng)建代碼-------------------------------- 第一次提交代碼完成。代碼:write code 1 備注:第一次提交代碼備注 --------------------第二次修改代碼-------------------------------- 第二次提交代碼完成。代碼:write code 2 備注:第二次提交代碼備注 --------------------第三次修改代碼-------------------------------- 第三次修改代碼。代碼:write code 3 --------------------在第三次修改代碼基礎(chǔ)上回退到第二次提交-------------------------------- 回退到第二次提交完成。代碼:write code 2 備注:第二次提交代碼備注 --------------------在第二次修改代碼基礎(chǔ)上回退到第一次提交-------------------------------- 回退到第一次提交完成。代碼:write code 1 備注:第一次提交代碼備注
到此,相信大家對“java備忘錄模式怎么實現(xiàn)”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
名稱欄目:java備忘錄模式怎么實現(xiàn)
鏈接地址:http://www.muchs.cn/article16/gehedg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、網(wǎng)站營銷、外貿(mào)建站、網(wǎng)站排名、品牌網(wǎng)站制作、網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)