<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 備忘錄設計模式 > 原文: [https://howtodoinjava.com/design-patterns/behavioral/memento-design-pattern/](https://howtodoinjava.com/design-patterns/behavioral/memento-design-pattern/) 備忘錄設計模式是行為型模式,是 GOF 討論的 23 種[設計模式](https://howtodoinjava.com/gang-of-four-java-design-patterns/)之一。 **備忘錄模式**用于將對象的狀態恢復到先前的狀態。 也稱為**快照模式**。 備忘錄就像對象生命周期中的還原點,客戶端應用可使用該還原點將對象狀態還原為其狀態。 從概念上講,這很像我們為操作系統創建還原點,并在發生故障或系統崩潰時用于還原系統。 > 備忘錄模式的目的是在不破壞封裝的情況下捕獲對象的內部狀態,從而提供一種在需要時將對象恢復為初始狀態的手段。 ## 1.何時使用備忘錄設計模式 在對象狀態不斷變化的任何應用中都應使用備忘錄模式,并且該應用的用戶可以在任何時候決定**回滾或撤消**所做的更改。 備忘錄也可用于必須從其上一個已知工作狀態或**草稿**重新啟動的應用中。 這樣的一個示例可以是 IDE,它可以在關閉 IDE 之前由用戶更改后重新啟動。 ## 2.備忘錄模式的真實示例 * 在 GUI 編輯器(例如 MS 畫圖)中,我們可以繼續對圖形進行更改,并且可以使用`CTRL + Z`之類的簡單命令來回滾更改。 * 在代碼編輯器中,我們可以使用簡單的命令將**撤消和重做**還原或應用任何代碼更改。 * 在計算器應用中,我們只需按一下按鈕就可以重新訪問內存中的所有計算。 * 在編程中,可以使用備忘錄在數據庫事務期間創建檢查點。 如果任何操作失敗,我們只需將所有內容回滾到最后一個已知的穩定數據庫狀態。 * `javax.swing.text.JTextComponent`類提供了撤消支持機制。 `javax.swing.undo.UndoManager`可以充當看守,`javax.swing.undo.UndoableEdit`的實現可以像備忘錄,而`javax.swing.text.Document`的實現可以像發起者。 ## 3.備忘錄設計模式 #### 3.1 架構 ![Memento Design Pattern](https://img.kancloud.cn/f5/5c/f55cafe1ffef9f1de22cf33634c0176a_680x240.png) 備忘錄設計模式 圖片提供 - [維基百科](https://en.wikipedia.org/wiki/File:W3sDesign_Memento_Design_Pattern_UML.jpg) #### 3.2 設計參與者 備忘錄模式有三個參與者。 1. **`Originator`** – 是知道如何創建和保存其狀態以備將來使用的對象。 它提供了方法`createMemento()`和`restore(memento)`。 2. **`Caretaker`** – 在發起者上執行操作,同時可能回滾。 它跟蹤多種備忘錄。 看守者類是指發起者類,用于保存和恢復發起者的內部狀態。 3. **`Memento`** – 由發起者編寫和讀取,并由看守者管理的鎖盒。 原則上,備忘錄必須在[不可變的](https://howtodoinjava.com/java/basics/how-to-make-a-java-class-immutable/)對象中,這樣一旦創建便沒有人可以更改其狀態。 ## 4\. 備忘錄設計模式示例 在此示例中,我們為`Article`對象創建備忘錄,該對象具有三個基本屬性 – `id`,`title`和`content`。 `ArticleMemento`類用作`Article`對象的備忘錄。 ```java public class Article { private long id; private String title; private String content; public Article(long id, String title) { super(); this.id = id; this.title = title; } //Setters and getters public ArticleMemento createMemento() { ArticleMemento m = new ArticleMemento(id, title, content); return m; } public void restore(ArticleMemento m) { this.id = m.getId(); this.title = m.getTitle(); this.content = m.getContent(); } @Override public String toString() { return "Article [id=" + id + ", title=" + title + ", content=" + content + "]"; } } ``` ```java public final class ArticleMemento { private final long id; private final String title; private final String content; public ArticleMemento(long id, String title, String content) { super(); this.id = id; this.title = title; this.content = content; } public long getId() { return id; } public String getTitle() { return title; } public String getContent() { return content; } } ``` `Main`類充當`Caretaker`,它創建并恢復`memento`對象。 ```java public class Main { public static void main(String[] args) { Article article = new Article(1, "My Article"); article.setContent("ABC"); //original content System.out.println(article); ArticleMemento memento = article.createMemento(); //created immutable memento article.setContent("123"); //changed content System.out.println(article); article.restore(memento); //UNDO change System.out.println(article); //original content } } ``` 程序輸出。 ```java Article [id=1, title=My Article, content=ABC] Article [id=1, title=My Article, content=123] Article [id=1, title=My Article, content=ABC] ``` ## 5.常見問題 #### 5.1 備忘錄是內部類嗎? 可以用許多不同的方式來實現備忘錄設計模式,例如內部類,包專用可見性或[序列化](https://howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/)等。實現備忘錄模式沒有固定的準則。 #### 5.2 備忘錄模式的好處 * 最大的優點是,您始終可以丟棄不需要的更改,并將其還原到預期或穩定的狀態。 * 您不會破壞與參與此模型的關鍵對象關聯的[封裝](https://howtodoinjava.com/oops/encapsulation-in-java-and-its-relation-with-abstraction/)。 * 保持高凝聚力。 * 提供一種簡單的恢復技術。 #### 5.3 備忘錄模式的挑戰 * 大量備忘錄需要更多存儲空間。 同時,他們給看守人增加了負擔。 * 同時還增加了維護成本,因為還需要付出代碼努力來管理備忘錄類。 * 保存狀態的額外時間降低了系統的整體性能。 在評論中向我發送有關**備忘錄模式**的問題。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看