备忘录模式 命令模式_备忘录设计模式示例
備忘錄模式 命令模式
本文是我們名為“ Java設(shè)計模式 ”的學(xué)院課程的一部分。
 在本課程中,您將深入研究大量的設(shè)計模式,并了解如何在Java中實現(xiàn)和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應(yīng)用模式中的每一個。 在這里查看 ! 
目錄
1.簡介 2.什么是Memento設(shè)計模式 3.實施Memento設(shè)計模式 4.何時使用紀(jì)念圖案 5. JDK中的Memento模式 6.下載源代碼1.簡介
有時有必要記錄對象的內(nèi)部狀態(tài)。 在實現(xiàn)檢查點和“撤消”機(jī)制時,這是必需的,該機(jī)制使用戶退出嘗試性操作或從錯誤中恢復(fù)。 您必須將狀態(tài)信息保存在某處,以便可以將對象還原到以前的狀態(tài)。 但是對象通常封裝了部分或全部狀態(tài),使得其他對象無法訪問它,并且無法在外部保存。 暴露此狀態(tài)將違反封裝,這可能會損害應(yīng)用程序的可靠性和可擴(kuò)展性。
可以使用Memento模式完成此操作,而無需暴露對象的內(nèi)部結(jié)構(gòu)。 需要捕獲其狀態(tài)的對象稱為始發(fā)者。
為了說明Memento模式的用法,我們來看一個示例。 我們將創(chuàng)建一個包含兩個雙精度類型字段的類,并在其上運行一些數(shù)學(xué)運算。 我們將為用戶提供撤消操作。 如果用戶不滿意某些操作后的結(jié)果,則用戶可以調(diào)用撤消操作,該操作會將對象的狀態(tài)恢復(fù)到最后保存的點。
該示例還包括一個保存點機(jī)制,用戶可以使用該保存點機(jī)制來保存對象的狀態(tài)。 我們還將提供各種撤消操作。 一個簡單的撤消操作會將對象狀態(tài)恢復(fù)到先前的保存點。 具有指定保存點的撤消操作將還原對象的特定狀態(tài),而全部撤消操作將刪除對象的所有保存狀態(tài),并在創(chuàng)建對象時將其恢復(fù)為初始化狀態(tài)。
在實施模式之前,讓我們進(jìn)一步了解Memento設(shè)計模式。
2.什么是Memento設(shè)計模式
Memento模式的目的是在不違反封裝的情況下捕獲并外部化對象的內(nèi)部狀態(tài),以便以后可以將對象恢復(fù)為該狀態(tài)。
圖1
紀(jì)念
- 存儲原始對象的內(nèi)部狀態(tài)。 紀(jì)念品可以根據(jù)原始作者的判斷存儲盡可能多的原始作者內(nèi)部狀態(tài)。
- 防止發(fā)起者以外的對象訪問。 備忘錄有效地具有兩個接口。 Caretaker看到與Memento的接口很狹窄-它只能將Memento傳遞給其他對象。 相反,Originator看到了一個廣泛的接口,該接口使它可以訪問將自身恢復(fù)到先前狀態(tài)所需的所有數(shù)據(jù)。 理想情況下,僅允許產(chǎn)生紀(jì)念品的始發(fā)者訪問紀(jì)念品的內(nèi)部狀態(tài)。
鼻祖
- 創(chuàng)建一個包含其當(dāng)前內(nèi)部狀態(tài)快照的紀(jì)念品。
- 使用紀(jì)念品恢復(fù)其內(nèi)部狀態(tài)。
看守人
- 負(fù)責(zé)紀(jì)念品的保管。
- 切勿操作或檢查紀(jì)念品的內(nèi)容。
當(dāng)客戶端想要保存發(fā)起者的狀態(tài)時,它向發(fā)起者請求當(dāng)前狀態(tài)。 發(fā)起者將恢復(fù)其狀態(tài)所需的所有那些屬性存儲在稱為Memento的單獨對象中,并將其返回給客戶端。 因此,在給定的時間點,可以將Memento視為包含另一個對象的內(nèi)部狀態(tài)的對象。 Memento對象必須對除原始者之外的所有對象隱藏原始者變量值。 換句話說,它應(yīng)保護(hù)其內(nèi)部狀態(tài),以防止除發(fā)起者以外的其他對象訪問。 為此,在允許始發(fā)者訪問其內(nèi)部狀態(tài)的同時,應(yīng)將Memento設(shè)計為提供對其他對象的受限訪問。
當(dāng)客戶希望將發(fā)起者恢復(fù)到其先前的狀態(tài)時,它只是將備忘錄傳遞回發(fā)起者。 始發(fā)者使用包含在memento中的狀態(tài)信息,并將自身返回到存儲在Memento對象中的狀態(tài)。
3.實施Memento設(shè)計模式
package com.javacodegeeks.patterns.mementopattern;public class Originator {private double x;private double y;private String lastUndoSavepoint;CareTaker careTaker;public Originator(double x, double y,CareTaker careTaker){this.x = x;this.y = y;this.careTaker = careTaker;createSavepoint("INITIAL");}public double getX(){return x;}public double getY(){return y;}public void setX(double x) {this.x = x;}public void setY(double y) {this.y = y;}public void createSavepoint(String savepointName){careTaker.saveMemento(new Memento(this.x, this.y), savepointName);lastUndoSavepoint = savepointName;}public void undo(){setOriginatorState(lastUndoSavepoint);}public void undo(String savepointName){setOriginatorState(savepointName);}public void undoAll(){setOriginatorState("INITIAL");careTaker.clearSavepoints();}private void setOriginatorState(String savepointName){Memento mem = careTaker.getMemento(savepointName);this.x = mem.getX();this.y = mem.getY();}@Overridepublic String toString(){return "X: "+x+", Y: "+y;}}上面是Originator類,其對象狀態(tài)應(yīng)保存在備忘錄中。 該類包含兩個double類型的字段x和y ,并且還引用了CareTaker 。 的CareTaker用來保存和檢索代表該狀態(tài)的紀(jì)念品對象Originator對象。
在構(gòu)造函數(shù)中,我們使用createSavepoint方法保存了對象的初始狀態(tài)。 此方法創(chuàng)建一個memento對象,并請求看護(hù)者照顧該對象。 我們使用了一個lastUndoSavepoint變量,該變量用于存儲上次保存的lastUndoSavepoint的鍵名,以實現(xiàn)undo操作。
該類提供三種類型的undo操作。 不帶任何參數(shù)的undo方法將還原最后保存的狀態(tài),以保存點名稱作為參數(shù)的undo將還原以該特定保存點名稱保存的狀態(tài)。 undoAll方法要求看護(hù)者清除所有保存點并將其設(shè)置為初始狀態(tài)(創(chuàng)建對象時的狀態(tài))。
package com.javacodegeeks.patterns.mementopattern;public class Memento {private double x;private double y;public Memento(double x, double y){this.x = x;this.y = y;}public double getX(){return x;}public double getY(){return y;} }該Memento類用于存儲的狀態(tài)Originator和照顧接受者存儲。 該類沒有任何設(shè)置方法,它僅用于獲取對象的狀態(tài)。
package com.javacodegeeks.patterns.mementopattern;import java.util.HashMap; import java.util.Map;public class CareTaker {private final Map<String, Memento>savepointStorage = new HashMap<String, Memento>();public void saveMemento(Memento memento,String savepointName){System.out.println("Saving state..."+savepointName);savepointStorage.put(savepointName, memento);}public Memento getMemento(String savepointName){System.out.println("Undo at ..."+savepointName);return savepointStorage.get(savepointName);}public void clearSavepoints(){System.out.println("Clearing all save points...");savepointStorage.clear();}}上面的類是用于存儲和提供請求的memento對象的看護(hù)者類。 該類包含saveMemento方法用于保存memento對象, getMemento方法用于返回請求memento對象,以及clearSavepoints方法用于清除所有保存點,并刪除所有已保存的memento對象。
現(xiàn)在,讓我們測試示例。
package com.javacodegeeks.patterns.mementopattern;public class TestMementoPattern {public static void main(String[] args) {CareTaker careTaker = new CareTaker();Originator originator = new Originator(5, 10, careTaker);System.out.println("Default State: "+originator);originator.setX(originator.getY()*51);System.out.println("State: "+originator);originator.createSavepoint("SAVE1");originator.setY(originator.getX()/22);System.out.println("State: "+originator);originator.undo();System.out.println("State after undo: "+originator);originator.setX(Math.pow(originator.getX(),3));originator.createSavepoint("SAVE2");System.out.println("State: "+originator);originator.setY(originator.getX()-30);originator.createSavepoint("SAVE3");System.out.println("State: "+originator);originator.setY(originator.getX()/22);originator.createSavepoint("SAVE4");System.out.println("State: "+originator);originator.undo("SAVE2");System.out.println("Retrieving at: "+originator);originator.undoAll();System.out.println("State after undo all: "+originator);}}上面的代碼將導(dǎo)致以下輸出。
Saving state...INITIAL Default State: X: 5.0, Y: 10.0 State: X: 510.0, Y: 10.0 Saving state...SAVE1 State: X: 510.0, Y: 23.181818181818183 Undo at ...SAVE1 State after undo: X: 510.0, Y: 10.0 Saving state...SAVE2 State: X: 1.32651E8, Y: 10.0 Saving state...SAVE3 State: X: 1.32651E8, Y: 1.3265097E8 Saving state...SAVE4 State: X: 1.32651E8, Y: 6029590.909090909 Undo at ...SAVE2 Retrieving at: X: 1.32651E8, Y: 10.0 Undo at ...INITIAL Clearing all save points... State after undo all: X: 5.0, Y: 10.0在上面的代碼中,我們創(chuàng)建了一個CareTaker對象,然后將其分配給Originator對象。 然后,將x和y的值分別設(shè)置為5和10。然后,對x一些運算并將對象的狀態(tài)保存為“ SAVE1”。
經(jīng)過更多的操作后,我們調(diào)用了undo方法來還原對象的最后狀態(tài),該狀態(tài)在輸出中會清楚顯示。 然后,我們執(zhí)行了一些操作,然后再次將對象的狀態(tài)保存為“ SAVE2,SAVE3和SAVE4”。
然后,我們問Originator恢復(fù)SAVE2狀態(tài)和呼叫undoAll方法,設(shè)置對象的初始狀態(tài),并刪除所有保存點。
請注意,在上面的示例中, Originator負(fù)責(zé)向護(hù)理者提供其紀(jì)念品。 原因是我們不想將這種責(zé)任賦予用戶。 在我們的示例中,用戶只需要請求保存點和對象狀態(tài)的恢復(fù)。 在許多情況下,看護(hù)人會由其他類別的人在發(fā)起人外部進(jìn)行操作(如上圖所示)。
4.何時使用紀(jì)念圖案
在以下情況下,請使用Memento模式:
- 必須保存對象狀態(tài)(部分狀態(tài))的快照,以便以后可以將其恢復(fù)到該狀態(tài),并且
- 獲取狀態(tài)的直接接口將公開實現(xiàn)細(xì)節(jié)并破壞對象的封裝。
5. JDK中的Memento模式
- java.util.Date
- java.io.Serializable
6.下載源代碼
這是關(guān)于Memento設(shè)計模式的課程。 您可以在此處下載源代碼: MementoDesignPattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/memento-design-pattern.html
備忘錄模式 命令模式
總結(jié)
以上是生活随笔為你收集整理的备忘录模式 命令模式_备忘录设计模式示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 大手玩家的最佳无线鼠标适合大手用的无线鼠
- 下一篇: 苹果手机怎样跟电脑互传文件iphone如
