免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

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

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

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

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

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

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

      Memento 設(shè)計模式

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

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

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

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

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

      UML 類圖

      實施步驟

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

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

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

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

      除了知道何時以及為什么要捕獲發(fā)起者的狀態(tài)之外,看守者還知道何時恢復(fù)它。 看守者可以通過存儲紀(jì)念品來跟蹤發(fā)起者的歷史。 當(dāng)發(fā)起者必須及時返回時,看守者從堆棧中檢索最頂部的 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 類嵌套在這個實現(xiàn)中的 originator 類中。發(fā)起者可以訪問備忘錄的字段和方法,即使它們已被聲明為私有。盡管如此,看守者對紀(jì)念品的字段和方法的訪問非常有限,這允許它在不改變其狀態(tài)的情況下將紀(jì)念品存儲在堆棧上。

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

      • 當(dāng)您需要創(chuàng)建對象狀態(tài)的快照以便能夠?qū)⑵浠謴?fù)到以前的狀態(tài)時,請使用 Memento 模式。
      • 每當(dāng)直接訪問對象的字段違反其封裝時,請使用此模式。 Memento 使對象本身負(fù)責(zé)拍攝其狀態(tài)的快照。快照不能被任何其他對象讀取,因此原始對象的狀態(tài)數(shù)據(jù)是安全可靠的。

      Memento 設(shè)計模式的優(yōu)點

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

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

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

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

      相關(guān)推薦

      • 英雄聯(lián)盟手游好玩嗎(英雄聯(lián)盟手游好玩還是端游好玩)

        簡要回答 非常好玩,英雄聯(lián)盟手游這款游戲已經(jīng)正式的進行公測,這款游戲是以5v5為模式進行對戰(zhàn)的,它是以英雄聯(lián)盟端游為原型進行開發(fā),里面的每一種玩法基本都沿襲了端游的特點。 01 這…

        2022年11月25日
      • 淘寶直播開通后帶貨鏈接怎么做(淘寶直播需要開通淘寶店鋪嗎)

        直播帶貨無論是對于商家來說還是主播收益都是非??捎^的,所以不少平臺都有直播帶貨功能,一些小伙伴也想加入淘寶直播,那么淘寶直播開通后帶貨鏈接怎么做?下面小編為大家?guī)硖詫氈辈ラ_通后帶…

        2022年11月24日
      • 快手限流多久能解除(快手限流什么意思)

        我相信很多人都看中了快手平臺的商機,都爭先恐后地想要搶占機會,可一些人剛剛作出一點成績,就被降權(quán)了,自己也不知道什么原因。所以今天就來聊聊快手賬號降權(quán)操作分享,趕快來看看避免違規(guī)!…

        2022年11月23日
      • 抖音怎么帶貨賺傭金(抖音怎么視頻帶鏈接)

        現(xiàn)在直播帶貨很火,而如今無論是自媒體還是短視頻,大家都可以通過帶貨來賺錢,只要你有貨源渠道,就可以通過帶貨來賺取傭金。如果你想要做帶貨傭金的話,你可以了解相關(guān)技能,例如,你必須與企…

        2022年11月22日
      • 劉慈欣親自解讀“黑暗森林”;《云頂之弈》全球總決賽XunGe奪冠丨每日B報

        星彡P(guān)丨文 每日一圖 早期帕底亞學(xué)生捕捉海地鼠的珍貴視頻,請自行搭配BGM《只因你太美》。 劉慈欣解讀“黑暗森林” 《三體》動畫將于12月3日開播,官方發(fā)布了一段預(yù)熱視頻,并邀請到…

        2022年11月22日
      • QQ發(fā)布6.8.8.6517測試版 新增GIF表情Tab

        騰訊 QQ 現(xiàn)已面向 macOS 用戶發(fā)布了 6.8.8.6517 測試版更新,帶來了新功能、體驗優(yōu)化和 Bug 修復(fù)。 新功能方面,測試版中,QQ 支持記憶消息輸入?yún)^(qū)大小和群成員…

        2022年11月22日
      • Win11 22H2再出新問題Bug:無法彈出USB設(shè)備

        作為Windows 11的首次大更新,在Win11 22H2發(fā)布后并沒有帶來預(yù)想的場景,各種問題頻現(xiàn)成為了一種常態(tài)。 近日有消息稱,Win11 22H2存在一個占用沖突Bug,當(dāng)用…

        2022年11月22日
      • 美團月付300小額取現(xiàn)?美團月付取現(xiàn)300不見了

        很多上班族每天都在使用美團點外賣,你知道美團現(xiàn)在推出了一款類似花唄的產(chǎn)品嗎?可以在美團消費的時候先消費后還款,叫做美團月付,是美團推出的一款消費型產(chǎn)品,不能直接提現(xiàn)到銀行卡,只能用…

        2022年11月21日
      • 我的世界指令創(chuàng)造(我的世界指令創(chuàng)造生存)

        只有允許作弊的地圖才可以用指令將世界切換到創(chuàng)造模式具體步驟如下1首先在地圖的選項界面,將地圖允許作弊按鈕打開2進入該可以作弊的地圖后 ,按下鍵盤上的~鍵,在彈出的對話框中,輸入ga…

        2022年11月20日
      • 丁俊暉2022斯諾克英錦賽直播觀看平臺 丁俊暉vs奧沙利文視頻直播入口CCTV5

        北京時間11月17日深夜,2022年斯諾克英國錦標(biāo)賽1/8決賽中國球手丁俊暉狀態(tài)極佳,以6比1橫掃威爾士選手杰米·克拉克闖入8強。1/4決賽,丁俊暉將迎戰(zhàn)已經(jīng)晉級的奧沙利文。 在這…

        2022年11月18日

      聯(lián)系我們

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