Home 科技 Java設計模式_(行為型...

Java設計模式_(行為型)_備忘錄模式


引用百科

備忘錄模式是一種軟件 設計模式 :在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。

相關角色

1. Originator (發起人):負責創建一個備忘錄Memento,用以記錄當前時刻自身的內部狀態,並可使用備忘錄恢復內部狀態。 Originator可以根據需要決定Memento存儲自己的哪些內部狀態。

2. Memento (備忘錄):負責存儲Originator對象的內部狀態,並可以防止Originator以外的其他對象訪問備忘錄。備忘錄有兩個接口:Caretaker只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其他對象。 Originator卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態所需要的所有數據。

3. Caretaker (管理者):負責備忘錄Memento,不能對Memento的內容進行訪問或者操作。

例:

如需要在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。以後再把該對象恢復到原先保存的狀態。那麼就可以用備忘錄模式去實現。

相關實現


具體代碼

1、備忘錄類

//備忘錄類public class Memento {

        private String status;

        public Memento(String status) {
                this.status = status;
        }

        public String getStatus() {
                return status;
        }

        public void setStatus(String status) {
                this.status = status;
        }
}

2、發起人角色類

//發起人角色類public class Originator {
        // 狀態private String status;

        // 創建備忘錄對象public Memento createMemento() {
                return new Memento(status);
        }

        // 恢復狀態public void replyMemento(Memento memento) {
                this.status = memento.getStatus();
        }

        public String getStatus() {
                return status;
        }

        public void setStatus(String status) {
                this.status = status;
        }

}

3、負責人類

//負責人角色public class Caretaker {
        //備忘錄private Memento memento;

        public Memento getMemento() {
                return memento;
        }

        public void setMemento(Memento memento) {
                this.memento = memento;
        }
}

4、客戶端Client測試

public class Client {

        public static void main(String[] args) {
                // 創建發起者Originator initiator = new Originator();
                // 設置初始化狀態initiator.setStatus("start");
                // 創建備忘錄對象Memento memento = initiator.createMemento();
                // 創建維護者Caretaker caretaker = new Caretaker();
                caretaker.setMemento(memento);

                System.out.println("當前狀態:" + initiator.getStatus());

                // 修改狀態initiator.setStatus("stop");
                System.out.println("當前狀態:" + initiator.getStatus());

                // 恢復之前的狀態initiator.replyMemento(caretaker.getMemento());
                System.out.println("當前狀態:" + initiator.getStatus());
        }
}

通過以上代碼簡單實現了備忘錄模式,運行輸出:

當前狀態:start
當前狀態:stop
當前狀態:start

備忘錄模式的優點和缺點
一、優點
1、有時一些發起人對象的內部信息必須保存在發起人對像以外的地方,但是必須要由發起人對象自己讀取,這時使用備忘錄模式可以把複雜的發起人內部信息對其他的對象屏蔽起來,從而可以恰當地保持封裝的邊界。
2、本模式簡化了發起人類。發起人不再需要管理和保存其內部狀態的一個個版本,客戶端可以自行管理他們所需要的這些狀態的版本。
3、當發起人角色的狀態改變的時候,有可能這個狀態無效,這時候就可以使用暫時存儲起來的備忘錄將狀態復原。

二、缺點:
1、如果發起人角色的狀態需要完整地存儲到備忘錄對像中,那麼在資源消耗上面備忘錄對象會很昂貴。
2、當負責人角色將一個備忘錄存儲起來的時候,負責人可能並不知道這個狀態會佔用多大的存儲空間,從而無法提醒用戶一個操作是否很昂貴。



文章來源