亚洲国产日韩人妖另类,久久只有这里有精品热久久,依依成人精品视频在线观看,免费国产午夜视频在线

      
      

        七爪源碼:學(xué)習(xí) Memento 設(shè)計(jì)模式

        七爪源碼:學(xué)習(xí) Memento 設(shè)計(jì)模式

        Memento 是一種行為設(shè)計(jì)模式,可讓您保存和恢復(fù)對(duì)象的先前狀態(tài),而無(wú)需透露其實(shí)現(xiàn)的細(xì)節(jié)。

        假設(shè)您正在創(chuàng)建一個(gè)文本編輯器應(yīng)用程序。除了編寫(xiě)文本之外,文本編輯器的基本要求之一是能夠撤消所做的更改。

        因此,您決定使用直接實(shí)現(xiàn),在該實(shí)現(xiàn)中,在執(zhí)行任何操作之前,應(yīng)用程序會(huì)記錄所有對(duì)象的狀態(tài)并將其存儲(chǔ)在某處。因此,當(dāng)用戶(hù)決定恢復(fù)操作時(shí),應(yīng)用程序會(huì)從歷史記錄中檢索最新的快照

        對(duì)象中所有字段的值都需要復(fù)制到存儲(chǔ)中。但是,這只有在對(duì)象放寬對(duì)其內(nèi)容的訪(fǎng)問(wèn)限制時(shí)才有可能,而現(xiàn)實(shí)生活中并非如此。

        Memento 設(shè)計(jì)模式

        損壞的封裝是我們剛剛遇到的問(wèn)題的原因。對(duì)象有時(shí)會(huì)嘗試做比他們應(yīng)該做的更多的事情。為了收集執(zhí)行特定操作所需的數(shù)據(jù),它們會(huì)侵入其他對(duì)象的私有空間,而不是讓這些對(duì)象執(zhí)行操作。

        Memento 模式將創(chuàng)建狀態(tài)快照的責(zé)任委托給狀態(tài)的實(shí)際所有者,即創(chuàng)建者對(duì)象。因此,其他對(duì)象不應(yīng)該嘗試復(fù)制編輯器的狀態(tài)。

        該模式建議將對(duì)象狀態(tài)的副本存儲(chǔ)在特殊的紀(jì)念品中。紀(jì)念品的內(nèi)容只能由產(chǎn)生它的對(duì)象訪(fǎng)問(wèn)。 Mementos 必須通過(guò)有限的接口與其他對(duì)象通信,該接口允許獲取快照的元數(shù)據(jù),但不能獲取原始對(duì)象的狀態(tài)。

        在這種限制性政策下,紀(jì)念品可以存儲(chǔ)在其他對(duì)象中,通常稱(chēng)為看守者。看守者對(duì)紀(jì)念品的訪(fǎng)問(wèn)權(quán)限有限,因此它無(wú)法更改其狀態(tài)。同樣,發(fā)起者可以訪(fǎng)問(wèn)備忘錄中的所有字段,允許它隨意恢復(fù)其先前的狀態(tài)。

        在實(shí)現(xiàn)撤銷(xiāo)時(shí),命令和備忘錄設(shè)計(jì)模式可以一起使用。命令負(fù)責(zé)對(duì)目標(biāo)對(duì)象執(zhí)行各種操作,而備忘錄在命令執(zhí)行之前記錄該對(duì)象的狀態(tài)。

        UML 類(lèi)圖

        實(shí)施步驟

      1. 確定哪個(gè)類(lèi)將是發(fā)起者。了解程序是使用一個(gè)中心對(duì)象還是許多較小的對(duì)象至關(guān)重要。
      2. 創(chuàng)建一個(gè)名為 Memento 的類(lèi)。一個(gè)一個(gè)地聲明一組與 originator 類(lèi)中的字段相對(duì)應(yīng)的字段。
      3. 使內(nèi)存類(lèi)不可變。 Mementos 應(yīng)該只通過(guò)構(gòu)造函數(shù)接受一次數(shù)據(jù)。該類(lèi)不應(yīng)該有二傳手。
      4. 如果您的編程語(yǔ)言支持嵌套類(lèi),則將備忘錄嵌套在創(chuàng)建者中。如果沒(méi)有,則從 memento 類(lèi)中提取一個(gè)空白接口,并讓所有其他對(duì)象使用它來(lái)引用 memento。您可能會(huì)向接口添加一些元數(shù)據(jù)操作,但不能添加任何暴露發(fā)起者狀態(tài)的操作。
      5. 向創(chuàng)建者類(lèi)添加一個(gè)方法來(lái)制作紀(jì)念品。發(fā)起者應(yīng)通過(guò)一個(gè)或多個(gè)參數(shù)將其狀態(tài)傳遞給備忘錄的構(gòu)造函數(shù)。該方法的返回類(lèi)型應(yīng)該是您在上一步中提取的接口的返回類(lèi)型。 memento-production 方法應(yīng)該直接與 memento 類(lèi)一起使用。
      6. 添加一個(gè)用于將創(chuàng)建者的狀態(tài)恢復(fù)到類(lèi)的方法。該方法應(yīng)該接受一個(gè)紀(jì)念品對(duì)象作為參數(shù)。如果您在上一步中提取了接口,請(qǐng)將其設(shè)為參數(shù)。因?yàn)榘l(fā)起者需要訪(fǎng)問(wèn)傳入的對(duì)象,所以需要進(jìn)行類(lèi)型轉(zhuǎn)換。
      7. 不管看守者是代表命令對(duì)象、歷史還是完全不同的東西,它都應(yīng)該知道何時(shí)向發(fā)起者請(qǐng)求新的紀(jì)念品,如何存儲(chǔ)它們,以及何時(shí)用特定的紀(jì)念品恢復(fù)發(fā)起者。
      8. 我們可以將看守者和發(fā)起者之間的鏈接移到紀(jì)念品類(lèi)中。因此,每個(gè)紀(jì)念品都必須與創(chuàng)建它的創(chuàng)建者相關(guān)聯(lián)?;謴?fù)也將轉(zhuǎn)移到紀(jì)念品類(lèi)。只有當(dāng) memento 類(lèi)嵌套在 originator 類(lèi)中或者 originator 類(lèi)提供了足夠的 setter 來(lái)覆蓋其狀態(tài)時(shí),這一切才有意義。
      9. 源代碼實(shí)現(xiàn)

        需要時(shí),Editor (Originator) 類(lèi)可以創(chuàng)建其自身狀態(tài)的快照以及從快照中恢復(fù)其狀態(tài)。

        Memento 是一個(gè)值對(duì)象,充當(dāng)發(fā)起者當(dāng)前狀態(tài)的快照。使備忘錄不可變并且只通過(guò)構(gòu)造函數(shù)傳遞一次數(shù)據(jù)是很常見(jiàn)的。

        package com.learncsdesign;public class Editor {private String text;private int cursorX;private int cursorY;private int selectionWidth;public void setText(String text) {this.text = text;}public String getText() {return text;}public void setCursor(int cursorX, int cursorY) {this.cursorX = cursorX;this.cursorY = cursorY;}public void setSelectionWidth(int selectionWidth) {this.selectionWidth = selectionWidth;}public Snapshot save() {return new Snapshot(text, cursorX, cursorY, selectionWidth);}public void restore(Snapshot snapshot) {setText(snapshot.getText());setCursor(snapshot.getCursorX(), snapshot.getCursorY());setSelectionWidth(snapshot.getSelectionWidth());}class Snapshot {private final String text;private final int cursorX;private final int cursorY;private final int selectionWidth;private Snapshot(String text, int cursorX, int cursorY, int selectionWidth) {this.text = text;this.cursorX = cursorX;this.cursorY = cursorY;this.selectionWidth = selectionWidth;}public String getText() {return text;}public int getCursorX() {return cursorX;}public int getCursorY() {return cursorY;}public int getSelectionWidth() {return selectionWidth;}}}

        除了知道何時(shí)以及為什么要捕獲發(fā)起者的狀態(tài)之外,看守者還知道何時(shí)恢復(fù)它。 看守者可以通過(guò)存儲(chǔ)紀(jì)念品來(lái)跟蹤發(fā)起者的歷史。 當(dāng)發(fā)起者必須及時(shí)返回時(shí),看守者從堆棧中檢索最頂部的 memento 并將其傳遞給發(fā)起者的恢復(fù)方法。

        package com.learncsdesign;import java.util.Stack;import com.learncsdesign.Editor.Snapshot;public class CareTaker {private static Stack snapshots = new Stack();private static void doBackup(Editor editor) {snapshots.push(editor.save());}private static void undo(Editor editor) {if (!snapshots.isEmpty()) {editor.restore(snapshots.pop());}}public static void main(String[] args) {Editor editor = new Editor();editor.setText(“Hello World!”);System.out.println(“Editor text: ” + editor.getText());doBackup(editor);editor.setText(“Hello Medium!”);System.out.println(“Editor modified text: ” + editor.getText());undo(editor);System.out.println(“Editor Restored text: ” + editor.getText());}}

        memento 類(lèi)嵌套在這個(gè)實(shí)現(xiàn)中的 originator 類(lèi)中。發(fā)起者可以訪(fǎng)問(wèn)備忘錄的字段和方法,即使它們已被聲明為私有。盡管如此,看守者對(duì)紀(jì)念品的字段和方法的訪(fǎng)問(wèn)非常有限,這允許它在不改變其狀態(tài)的情況下將紀(jì)念品存儲(chǔ)在堆棧上。

        何時(shí)應(yīng)用 Memento 設(shè)計(jì)模式

        • 當(dāng)您需要?jiǎng)?chuàng)建對(duì)象狀態(tài)的快照以便能夠?qū)⑵浠謴?fù)到以前的狀態(tài)時(shí),請(qǐng)使用 Memento 模式。
        • 每當(dāng)直接訪(fǎng)問(wèn)對(duì)象的字段違反其封裝時(shí),請(qǐng)使用此模式。 Memento 使對(duì)象本身負(fù)責(zé)拍攝其狀態(tài)的快照??煺詹荒鼙蝗魏纹渌麑?duì)象讀取,因此原始對(duì)象的狀態(tài)數(shù)據(jù)是安全可靠的。

        Memento 設(shè)計(jì)模式的優(yōu)點(diǎn)

        • 可以在不違反其封裝的情況下創(chuàng)建對(duì)象狀態(tài)的快照。
        • 讓看守者維護(hù)發(fā)起者狀態(tài)的歷史,以便簡(jiǎn)化發(fā)起者的代碼。

        如果你喜歡這篇文章,你知道該怎么做

        關(guān)注七爪網(wǎng),獲取更多APP/小程序/網(wǎng)站源碼資源!

        鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
        上一篇 2022年6月20日 23:21
        下一篇 2022年6月20日 23:21

        相關(guān)推薦

        聯(lián)系我們

        聯(lián)系郵箱:admin#wlmqw.com
        工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息