日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

备忘录设计模式示例

發布時間:2023/12/3 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 备忘录设计模式示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是我們名為“ Java設計模式 ”的學院課程的一部分。

在本課程中,您將深入研究大量的設計模式,并了解如何在Java中實現和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應用模式中的每一個。 在這里查看 !

目錄

1.簡介 2.什么是Memento設計模式 3.實施Memento設計模式 4.何時使用紀念圖案 5. JDK中的Memento模式 6.下載源代碼

1.簡介

有時有必要記錄對象的內部狀態。 在實施檢查點和“撤消”機制時,這是必需的,該機制使用戶退出嘗試性操作或從錯誤中恢復。 您必須將狀態信息保存在某處,以便可以將對象還原到其先前的狀態。 但是對象通常封裝了部分或全部狀態,使得其他對象無法訪問它,并且無法在外部保存。 暴露此狀態將違反封裝,這可能會損害應用程序的可靠性和可擴展性。

可以使用Memento模式完成此操作,而無需暴露對象的內部結構。 需要捕獲其狀態的對象稱為始發者。

為了說明Memento模式的用法,我們來看一個示例。 我們將創建一個包含兩個雙精度類型字段的類,并在其上運行一些數學運算。 我們將為用戶提供撤消操作。 如果用戶不滿意某些操作后的結果,則用戶可以調用撤消操作,該操作會將對象的狀態恢復到最后保存的點。

該示例還包括一個保存點機制,用戶可以使用該機制保存對象的狀態。 我們還將提供各種撤消操作。 一個簡單的撤消操作會將對象狀態恢復到先前的保存點。 具有指定保存點的撤消將還原對象的特定狀態,而全部撤消將刪除對象的所有已保存狀態,并在創建對象時將其恢復為初始化狀態。

在實施模式之前,讓我們進一步了解Memento設計模式。

2.什么是Memento設計模式

Memento模式的目的是在不違反封裝的情況下捕獲并外部化對象的內部狀態,以便以后可以將對象恢復為該狀態。

圖1

紀念品

  • 存儲原始對象的內部狀態。 紀念品可以根據原始創建者的判斷存儲盡可能多的原始內部狀態。
  • 防止發起者以外的對象訪問。 備忘錄有效地具有兩個接口。 Caretaker看到與Memento的接口很狹窄-它只能將Memento傳遞給其他對象。 相反,Originator看到了一個廣泛的接口,該接口使它可以訪問將自身恢復到先前狀態所需的所有數據。 理想情況下,僅允許產生紀念品的始發者訪問紀念品的內部狀態。

鼻祖

  • 創建一個包含其當前內部狀態快照的紀念品。
  • 使用紀念品恢復其內部狀態。

看守人

  • 負責紀念品的保管。
  • 切勿操作或檢查紀念品的內容。

當客戶端想要保存發起者的狀態時,它向發起者請求當前狀態。 發起方將恢復其狀態所需的所有那些屬性存儲在稱為Memento的單獨對象中,并將其返回給客戶端。 因此,在給定的時間點,可以將Memento視為包含另一個對象的內部狀態的對象。 一個Memento對象必須對除原始者之外的所有對象隱藏原始者變量值。 換句話說,它應該保護其內部狀態,以防止除原始方以外的其他對象訪問。 為此,在允許始發者訪問其內部狀態的同時,應將Memento設計為提供對其他對象的受限訪問。

當客戶希望將發起者恢復到其先前的狀態時,它只是將備忘錄傳遞回發起者。 始發者使用包含在memento中的狀態信息,并將自身返回到存儲在Memento對象中的狀態。

3.實施Memento設計模式

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類,其對象狀態應保存在內存中。 該類包含兩個double類型的字段x和y ,并且還引用了CareTaker 。 的CareTaker用來保存和檢索代表該狀態的紀念品對象Originator對象。

在構造函數中,我們使用createSavepoint方法保存了對象的初始狀態。 此方法創建一個memento對象,并請求看護者照顧該對象。 我們使用了lastUndoSavepoint變量,該變量用于存儲上次保存的lastUndoSavepoint的鍵名,以實現undo操作。

該類提供三種類型的undo操作。 不帶任何參數的undo方法將還原最后保存的狀態,以保存點名稱作為參數的undo將還原使用該特定保存點名稱保存的狀態。 undoAll方法要求看護者清除所有保存點并將其設置為初始狀態(創建對象時的狀態)。

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類用于存儲的狀態Originator和照顧接受者存儲。 該類沒有任何設置方法,僅用于獲取對象的狀態。

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對象的看護者類。 該類包含saveMemento方法用于保存memento對象, getMemento方法用于返回請求memento對象,以及clearSavepoints方法用于清除所有保存點,并刪除所有已保存的memento對象。

現在,讓我們測試示例。

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);}}

上面的代碼將導致以下輸出。

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

在上面的代碼中,我們創建了一個CareTaker對象,然后將其分配給Originator對象。 然后,將x和y的值分別設置為5和10。然后,對x一些運算并將對象的狀態保存為“ SAVE1”。

經過更多的操作后,我們調用了undo方法來恢復對象的最后狀態,該狀態在輸出中會清楚顯示。 然后,我們進行了一些操作,然后再次將對象的狀態保存為“ SAVE2,SAVE3和SAVE4”。

然后,我們問Originator恢復SAVE2狀態和呼叫undoAll方法,設置對象的初始狀態,并刪除所有保存點。

請注意,在以上示例中, Originator負責將其紀念品提供給看護者。 原因是我們不想將這種責任賦予用戶。 在我們的示例中,用戶只需要請求保存點和對象狀態的恢復。 在許多情況下,看護人會由其他類別的人在發起人外部進行操作(如上圖所示)。

4.何時使用紀念圖案

在以下情況下,請使用Memento模式:

  • 必須保存對象狀態(部分狀態)的快照,以便以后可以將其恢復到該狀態,并且
  • 獲取狀態的直接接口將公開實現細節并破壞對象的封裝。

5. JDK中的Memento模式

  • java.util.Date
  • java.io.Serializable

6.下載源代碼

這是關于Memento設計模式的課程。 您可以在此處下載源代碼: MementoDesignPattern-Project

翻譯自: https://www.javacodegeeks.com/2015/09/memento-design-pattern.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的备忘录设计模式示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。