原文地址:折騰Java設(shè)計模式之備忘錄模式
創(chuàng)新互聯(lián)專注于朔州企業(yè)網(wǎng)站建設(shè),成都響應式網(wǎng)站建設(shè)公司,商城系統(tǒng)網(wǎng)站開發(fā)。朔州網(wǎng)站建設(shè)公司,為朔州等地區(qū)提供建站服務。全流程按需定制,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務
Without violating encapsulation, capture and externalize an object's internal state allowing the object to be restored to this state later.
在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。
所謂備忘錄模式就是在不破壞封裝的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài),這樣可以在以后將對象恢復到原先保存的狀態(tài)。很多時候我們總是需要記錄一個對象的內(nèi)部狀態(tài),這樣做的目的就是為了允許用戶取消不確定或者錯誤的操作,能夠恢復到他原先的狀態(tài),使得他有"后悔藥"可吃。通過一個備忘錄類專門存儲對象狀態(tài)??蛻舨慌c備忘錄類耦合,與備忘錄管理類耦合。
cdn.xitu.io/2019/4/9/169ffaebd9654dda?w=680&h=240&f=jpeg&s=26778">
Caretaker類是指用于保存(createMemento())和還原(restore(memento))發(fā)起方內(nèi)部狀態(tài)的Originator類。
發(fā)起方類實現(xiàn)
(1)createMemento(),通過創(chuàng)建和返回存儲發(fā)起方當前內(nèi)部狀態(tài)的memento對象
(2)通過從傳入的memento對象還原狀態(tài)來還原(memento)。
(1)保存發(fā)起人的內(nèi)部狀態(tài):Caretaker對Originator調(diào)用createMemento(),創(chuàng)建memento對象,保存其當前內(nèi)部狀態(tài)(setState()),并將memento返回給Caretaker。
(2)恢復發(fā)起人的內(nèi)部狀態(tài):Caretaker對Originator調(diào)用restore(memento),并指定存儲應恢復狀態(tài)的memento對象。發(fā)起者從memento獲取狀態(tài)(getState())以設(shè)置其自己的狀態(tài)。
(1) 備忘錄(Memento)角色:備忘錄角色存儲“備忘發(fā)起角色”的內(nèi)部狀態(tài)?!皞渫l(fā)起角色”根據(jù)需要決定備忘錄角色存儲“備忘發(fā)起角色”的哪些內(nèi)部狀態(tài)。為了防止“備忘發(fā)起角色”以外的其他對象訪問備忘錄。備忘錄實際上有兩個接口,“備忘錄管理者角色”只能看到備忘錄提供的窄接口——對于備忘錄角色中存放的屬性是不可見的?!皞渫l(fā)起角色”則能夠看到一個寬接口——能夠得到自己放入備忘錄角色中屬性。
(2) 備忘發(fā)起(Originator)角色:“備忘發(fā)起角色”創(chuàng)建一個備忘錄,用以記錄當前時刻它的內(nèi)部狀態(tài)。在需要時使用備忘錄恢復內(nèi)部狀態(tài)。
(3) 備忘錄管理者(Caretaker)角色:負責保存好備忘錄。不能對備忘錄的內(nèi)容進行操作或檢查。
源碼地址
public class Caretaker {
? public static void main(String[] args) {
? List<Memento> savedStates = new ArrayList();
? Originator originator = new Originator();
? originator.set("State1");
? originator.set("State2");
? savedStates.add(originator.saveToMemento());
? originator.set("State3");
? savedStates.add(originator.saveToMemento());
? originator.set("State4");
? originator.restoreFromMemento(savedStates.get(1));
? }
}
@Slf4j
public class Originator {
? private String state;
? //狀態(tài)更改
? public void set(String state) {
? this.state = state;
? log.info("Originator: Setting state to {}", state);
? }
? //將狀態(tài)保存到備忘錄里
? public Memento saveToMemento() {
? log.info("Originator: Saving to Memento.");
? return new Memento(this.state);
? }
? //從備忘錄里取出狀態(tài)并回滾
? public void restoreFromMemento(Memento memento) {
? this.state = memento.getState();
? log.info("Originator: State after restoring from Memento: {}", state);
? }
}
@Data
@AllArgsConstructor
public class Memento {
? //狀態(tài)維護
? private String state;
}
示例結(jié)果
從上述代碼中看的出,隨著狀態(tài)變更,用List維護發(fā)起者的狀態(tài)列表,從備忘錄中取出狀態(tài)以便回退狀態(tài)。
生成對象狀態(tài)的一個快照,以便對象可以恢復原始狀態(tài)而不用暴露自身的內(nèi)容。Date對象通過自身內(nèi)部的一個long值來實現(xiàn)備忘錄模式。
java.util.Date
java.io.Serializable
1、給用戶提供了一種可以恢復狀態(tài)的機制,可以使用戶能夠比較方便地回到某個歷史的狀態(tài)。 2、實現(xiàn)了信息的封裝,使得用戶不需要關(guān)心狀態(tài)的保存細節(jié)。
消耗資源。如果類的成員變量過多,勢必會占用比較大的資源,而且每一次保存都會消耗一定的內(nèi)存。
1、需要保存/恢復數(shù)據(jù)的相關(guān)狀態(tài)場景。 2、提供一個可回滾的操作。
1、為了符合迪米特原則,還要增加一個管理備忘錄的類。 2、為了節(jié)約內(nèi)存,可使用原型模式+備忘錄模式。
備忘錄模式|菜鳥教程
Memento pattern
細數(shù)JDK里的設(shè)計模式
歡迎關(guān)注
分享文章:折騰Java設(shè)計模式之備忘錄模式
網(wǎng)站鏈接:http://muchs.cn/article0/jpipoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、電子商務、網(wǎng)站設(shè)計公司、網(wǎng)站改版、網(wǎng)站策劃、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)