【设计模式】备忘录模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目錄
- 一、備忘錄模式簡介
- 二、備忘錄模式 適用場景
- 三、備忘錄模式 優(yōu)缺點
- 四、備忘錄模式 與 狀態(tài)模式
- 五、備忘錄模式 代碼示例
- 1、文檔類
- 2、文檔備忘錄類
- 3、文檔備忘錄管理類
- 4、測試類
一、備忘錄模式簡介
備忘錄模式 : 保存 對象 的 某個狀態(tài) , 以便在 適當(dāng)?shù)臅r候 恢復(fù)對象 ;
( 形象的比喻 : " 后悔藥 " )
如 : 游戲存檔 , 一些編輯工具中的 " 撤銷 " 操作 , 瀏覽器中的 后退 ;
備忘錄模式 類型 : 行為型 ;
二、備忘錄模式 適用場景
備忘錄模式 適用場景 :
-
撤銷操作 : 保存 / 恢復(fù) 數(shù)據(jù) 的相關(guān)業(yè)務(wù)場景 ;
如 : 在 Word 中編寫文檔 , 如果想要撤銷之前的 輸入 / 刪除操作 , 使用 Ctrl + Z 執(zhí)行 " 撤銷 " 操作 ; -
狀態(tài)恢復(fù) : 在 " 后悔 " 的時候 , 將對象恢復(fù)到之前的狀態(tài) ;
如 : 游戲中的存檔使用 ;
三、備忘錄模式 優(yōu)缺點
備忘錄模式 優(yōu)點 :
- 存檔信息 : 封裝 存檔信息 ;
- 恢復(fù)機制 : 為 用戶 提供一種 可恢復(fù) 機制 ;
先封裝 存檔信息 , 然后才可以提供 可恢復(fù)機制 ;
封裝的 對象的狀態(tài) , 就是 對象中 各個屬性的屬性值 , 快照 ;
備忘錄模式 缺點 : 資源占用 , 會額外 占用 磁盤 / 內(nèi)存 等資源 ;
四、備忘錄模式 與 狀態(tài)模式
備忘錄模式 與 狀態(tài)模式 :
-
備忘錄模式狀態(tài)表示 : 備忘錄模式 中 , 使用 對象實例 表示狀態(tài) , 當(dāng)前對象的 存檔 是該對象的實例 ;
-
狀態(tài)模式狀態(tài)表示 : 狀態(tài)模式 中 , 使用 類 表示狀態(tài) ;
五、備忘錄模式 代碼示例
業(yè)務(wù)場景 : 編輯文檔 , 有暫存功能 , 暫時先保存到內(nèi)存中 ;
1、文檔類
package memento;/*** 文檔* 需要保存的對象*/ public class Article {private String title;private String content;private String image;public Article(String tittle, String content, String image) {this.title = tittle;this.content = content;this.image = image;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getImage() {return image;}public void setImage(String image) {this.image = image;}/*** 保存信息到備忘錄* @return*/public ArticleMemento saveToMemento() {ArticleMemento articleMemento = new ArticleMemento(title, content, image);return articleMemento;}/*** 從備忘錄恢復(fù)* @param articleMemento*/public void undoFromMemento(ArticleMemento articleMemento) {this.title = articleMemento.getTitle();this.content = articleMemento.getContent();this.image = articleMemento.getImage();}@Overridepublic String toString() {return "Article{" +"title='" + title + '\'' +", content='" + content + '\'' +", image='" + image + '\'' +'}';} }
2、文檔備忘錄類
package memento;/*** 文檔的備忘錄類* 主要用于存儲文檔的各種屬性狀態(tài)信息* 備忘錄 快照 沒有 set 方法* 只能通過構(gòu)造函數(shù)設(shè)置備忘錄數(shù)據(jù)*/ public class ArticleMemento {private String title;private String content;private String image;public ArticleMemento(String title, String content, String image) {this.title = title;this.content = content;this.image = image;}public String getTitle() {return title;}public String getContent() {return content;}public String getImage() {return image;}@Overridepublic String toString() {return "ArticleMemento{" +"title='" + title + '\'' +", content='" + content + '\'' +", image='" + image + '\'' +'}';} }
3、文檔備忘錄管理類
package memento;import java.util.Stack;/*** 備忘錄管理類*/ public class ArticleMementoManager {/*** 存儲所有的備忘錄信息* 在 棧 數(shù)據(jù)結(jié)構(gòu)中存儲 , 特點后進(jìn)先出*/private final Stack<ArticleMemento> mArticleMementoStack = new Stack<>();/*** 獲取棧頂?shù)膫渫浶畔? @return*/public ArticleMemento getArticleMemento() {return mArticleMementoStack.pop();}/*** 備忘錄信息入棧* 放在棧頂* @param articleMemento*/public void setArticleMemento(ArticleMemento articleMemento) {mArticleMementoStack.push(articleMemento);} }
4、測試類
package memento;public class Main {public static void main(String[] args) {ArticleMementoManager articleMementoManager = new ArticleMementoManager();// 創(chuàng)建并輸入文檔內(nèi)容Article article = new Article("標(biāo)題", "內(nèi)容", "圖片鏈接");// 保存?zhèn)渫浶畔?/span>ArticleMemento articleMemento = article.saveToMemento();// 將備忘錄信息設(shè)置到 備忘錄管理者articleMementoManager.setArticleMemento(articleMemento);// 打印備忘錄內(nèi)容System.out.println("文檔信息 : " + article.toString());// 修改文檔內(nèi)容article.setTitle("標(biāo)題 2");article.setContent("內(nèi)容 2");article.setImage("圖片鏈接 2");// 保存新的備忘錄信息articleMemento = article.saveToMemento();// 將備忘錄信息設(shè)置到 備忘錄管理者articleMementoManager.setArticleMemento(articleMemento);// 打印備忘錄內(nèi)容System.out.println("文檔信息 : " + article.toString());// 此時 ArticleMementoManager 中存儲了 2 個存檔// 存檔 1 : Article{title='標(biāo)題', content='內(nèi)容', image='圖片鏈接'}// 存檔 2 : Article{title='標(biāo)題 2', content='內(nèi)容 2', image='圖片鏈接 2'}// 使用備忘錄回退// 先將棧頂?shù)漠?dāng)前備忘錄出棧 , 移除articleMementoManager.getArticleMemento();// 然后獲取上一個備忘錄 , 并設(shè)置到 Article 中article.undoFromMemento(articleMementoManager.getArticleMemento());// 打印備忘錄內(nèi)容System.out.println("文檔信息 : " + article.toString());} }
總結(jié)
以上是生活随笔為你收集整理的【设计模式】备忘录模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【设计模式】命令模式 ( 简介 | 适用
- 下一篇: 【设计模式】观察者模式 ( 简介 | 适