亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

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

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

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

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

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

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

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

                損壞的封裝是我們剛剛遇到的問題的原因。對(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ì)象訪問。 Mementos 必須通過有限的接口與其他對(duì)象通信,該接口允許獲取快照的元數(shù)據(jù),但不能獲取原始對(duì)象的狀態(tài)。

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

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

                UML 類圖

                實(shí)施步驟

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

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

                Memento 是一個(gè)值對(duì)象,充當(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;}}}

                除了知道何時(shí)以及為什么要捕獲發(fā)起者的狀態(tài)之外,看守者還知道何時(shí)恢復(fù)它。 看守者可以通過存儲(chǔ)紀(jì)念品來跟蹤發(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 類嵌套在這個(gè)實(shí)現(xiàn)中的 originator 類中。發(fā)起者可以訪問備忘錄的字段和方法,即使它們已被聲明為私有。盡管如此,看守者對(duì)紀(jì)念品的字段和方法的訪問非常有限,這允許它在不改變其狀態(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)直接訪問對(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)盟手游好玩還是端游好玩)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                  2022年11月18日

                聯(lián)系我們

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