首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設計模式之備忘錄模式介紹

     編輯:Java 相關知識

備忘錄模式:捕獲並恢復對象內部狀態

備忘錄模式 屬於行為型模式。它在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態,以便以後將該對象恢復到原先保存的狀態。

核心角色

  • Originator(發起人):創建備忘錄,記錄當前狀態;可從備忘錄恢復狀態。
  • Memento(備忘錄):存儲 Originator 的內部狀態,防止除 Originator 外的對象訪問。
  • Caretaker(管理者):負責保存備忘錄,不對其內容進行操作或檢查。

代碼範例

// 發起人
public class Originator {
    private int number;
    private File file;

    // 創建備忘錄
    public Memento getMemento() {
        return new Memento(this);
    }

    // 恢復狀態
    public void setMemento(Memento m) {
        this.number = m.number;
        this.file = m.file;
    }

    // 內部類:備忘錄,僅 Originator 可訪問
    private static class Memento implements Serializable {
        private int number;
        private File file;
        public Memento(Originator o) {
            this.number = o.number;
            this.file = o.file;
        }
    }
}

// 管理者
public class Caretaker {
    private Memento memento;
    public void saveMemento(Memento m) { this.memento = m; }
    public Memento getMemento() { return memento; }
}

// 客戶端
public class Client {
    public static void main(String[] args) {
        Originator o = new Originator();
        Caretaker c = new Caretaker();
        c.saveMemento(o.getMemento()); // 保存狀態
        // ... 修改 o 的狀態 ...
        o.setMemento(c.getMemento());  // 恢復狀態
    }
}

模式特點

  • 封裝性:備忘錄對象對發起人以外的對象是不透明的(窄接口),發起人可訪問所有狀態(寬接口)。
  • 單一職責:發起人負責業務邏輯,管理者負責備忘錄存儲。
  • 缺點:若狀態數據量大,頻繁創建備忘錄會消耗大量內存。

Web 應用場景:表單數據回顯

在 JSP/Servlet 或 MVC 框架中,用戶提交表單驗證失敗時,需回顯已輸入數據。此時可將表單數據封裝為 JavaBean,放入 request 或 session 作用域(即充當 Caretaker),頁面重渲染時從 Bean 讀取數據填充表單,這本質上就是備忘錄模式的應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved