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