Java設(shè)計模式初識之備忘錄模式詳解
簡介
備忘錄設(shè)計模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于實現(xiàn)防丟失、撤銷、恢復(fù)等功能。
其定義是,在不違背封裝原則的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài),以便之后恢復(fù)對象先前的狀態(tài)。
典型實現(xiàn)
首先,定義一個備忘錄 Memento 類存儲狀態(tài),其代碼示例如下:
public class Memento { private String state; public Memento(Originator o) { this.state = o.getState(); } public void setState(String State) { this.state = state; } public String getState() { return this.state; } }
然后,把需要被存儲狀態(tài)的對象稱作為發(fā)起者,定義為 Originator 類,包含用于存儲成員數(shù)據(jù)的屬性,其代碼示例如下:
public class Originator { private String state; public Originator() {} // 創(chuàng)建一個備忘錄對象 public Memento createMemento() { return new Memento(this); } // 根據(jù)備忘錄狀態(tài)恢復(fù)原發(fā)器狀態(tài) public void restoreMemento(Memento m) { state = m.getState(); } public void setState(String State) { this.state = state; } public String getState() { return this.state; } }
定義一個負責(zé)人 Caretaker 用于管理備忘錄對象,其代碼示例如下:
public class Caretaker { private Memento memento; public Memento getMemento() { return this.memento; } public void setMemento(Memento memento) { this.memento = memento; } }
總結(jié)
優(yōu)點
備忘錄模式的主要優(yōu)點如下:
給用戶提供了一種可以恢復(fù)狀態(tài)的機制,可以使用戶能夠比較方便地回到某個歷史的狀態(tài)
實現(xiàn)了內(nèi)部狀態(tài)的封裝,使得用戶不需要關(guān)心狀態(tài)的保存細節(jié)
缺點
備忘錄模式的主要缺點如下:
如果要保存的內(nèi)部狀態(tài)信息過多或者特別頻繁,將會占用比較大的內(nèi)存資源
適用場景
備忘錄模式的適用場景如下:
保存一個對象在某一時刻的全部狀態(tài)或部分狀態(tài),方便后續(xù)實現(xiàn)恢復(fù)和撤銷
防止外界對象破壞一個對象歷史狀態(tài)的封裝性,避免將對象歷史狀態(tài)的實現(xiàn)細節(jié)暴露給外界對象
源碼
在 JDK 中 java.util.Date 通過自身內(nèi)部的一個 Long 值來實現(xiàn)備忘錄模式。
如下是源碼部分:
public class Date implements java.io.Serializable, Cloneable, Comparable<Date> { private transient long fastTime; public Date(long date) { fastTime = date; } public long getTime() { return getTimeImpl(); } private final long getTimeImpl() { if (cdate != null && !cdate.isNormalized()) { normalize(); } return fastTime; } }
到此這篇關(guān)于Java設(shè)計模式初識之備忘錄模式詳解的文章就介紹到這了,更多相關(guān)Java備忘錄模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java數(shù)據(jù)結(jié)構(gòu)實現(xiàn)雙向鏈表功能
這篇文章主要為大家詳細介紹了java數(shù)據(jù)結(jié)構(gòu)實現(xiàn)雙向鏈表功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11很多人竟然不知道Java線程池的創(chuàng)建方式有7種
本文主要介紹了很多人竟然不知道Java線程池的創(chuàng)建方式有7種,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07idea?Maven?插件?docker-maven-plugin?打包docker鏡像上傳到遠程倉庫的過程詳解
這篇文章主要介紹了idea Maven插件docker-maven-plugin打包docker鏡像上傳到遠程倉庫,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05SpringBoot配置 Druid 三種方式(包括純配置文件配置)
本文給大家分享在項目中用純 YML(application.yml 或者 application.properties)文件、Java 代碼配置 Bean 和注解三種方式配置 Alibaba Druid 用于監(jiān)控或者查看 SQL 狀況的相關(guān)知識,感興趣的朋友一起看看吧2021-10-10Java處理圖片實現(xiàn)base64編碼轉(zhuǎn)換
這篇文章主要介紹了Java處理圖片實現(xiàn)base64編碼轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02使用JMeter進行接口高并發(fā)測試的實現(xiàn)
本文主要介紹了使用JMeter進行接口高并發(fā)測試的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04