備忘錄模式 詳解

定義

在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態;

行為型模式

角色

  • 發起人角色(Originator):記錄當前時刻的內部狀態,負責定義哪些屬于備份范圍的狀態,負責創建和恢復備忘錄數據;
  • 備忘錄角色(Memento):負責存儲發起人對象的內部狀態,在需要的時候提供發起人需要的內部狀態;
  • 管理者角色(Caretaker):對備忘錄 進行管理,保存和提供備忘錄;

從網上找到的例圖
enter image description here


適用場景

  • 需要保存一個對象在某一個時刻的狀態或者部分狀態;
  • 如果用一個接口來讓其他對象得到這些狀態,將會暴露對象的實現細節并破壞對象的封裝性,一個對象不希望外界直接訪問其內部狀態,通過負責人可以間接訪問其內部狀態;

例子

  • 這個就像你寫代碼,當你不小心刪除了幾行代碼,這個時候你只需要command + z 就可以返回,這就像備忘錄模式,系統幫你保存之前的狀態;

實現代碼

/*** Created by George on 16/7/16.*/
// 發起角色
var Originator = function () {this.getState = function () {return this.state;};this.setState = function (state) {this.state = state;};this.createMemento = function () {return new Memento(this.state);};this.restoreMemento = function (memento) {this.setState(memento.getState());};
};// 備忘錄
var Memento = function (state) {this.state = state;this.getState = function () {return this.state;};this.setState = function (state) {this.state = state;};
};// 負責人角色
var Caretaker = function () {this.memento = null;this.getMemento = function () {return this.memento;};this.setMemento = function (memento) {this.memento = memento;};
};var originator = new Originator();
originator.setState("狀態1 ");
console.log("初始狀態 " + originator.getState());var caretaker = new Caretaker();
caretaker.setMemento(originator.createMemento());
originator.setState("狀態2 ");console.log("改變后狀態 " + originator.getState());originator.restoreMemento(caretaker.getMemento());console.log("恢復狀態 " + originator.getState());

實現結果:
這里寫圖片描述


優缺點

  1. 當發起人角色中的狀態改變的時候,可以還原到之前的狀態;
  2. 備份的狀態是保存在發起人角色之外的,這樣發起人角色就不需要對各個備份的狀態進行管理;

注意的是

  1. 備忘錄模式都是多狀態和多備份的,發起人角色的狀態需要存儲到備忘錄對象中,對資源的消耗是不叫嚴重的;

轉載于:https://www.cnblogs.com/George1994/p/6037625.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394734.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dll oem證書導入工具_技術干貨 | 惡意代碼分析之反射型DLL注入

歡迎各位添加微信號:qinchang_198231 加入安全 交流群 和大佬們一起交流安全技術01技術概要這是一種允許攻擊者從內存而非磁盤向指定進程注入DLL的技術,該技術比常規的DLL注入更為隱蔽,因為除了不需要磁盤上的實際DLL文件之外,它…

像程序員一樣思考_如何像程序員一樣思考-解決問題的經驗教訓

像程序員一樣思考by Richard Reis理查德里斯(Richard Reis) 如何像程序員一樣思考-解決問題的經驗教訓 (How to think like a programmer — lessons in problem solving) If you’re interested in programming, you may well have seen this quote before:如果您對編程感興趣…

CF908G New Year and Original Order 數位DP

傳送門 看到數據范圍到\(10^{700}\)毫無疑問數位DP。那么我們最重要的問題是如何有效地維護所有數位排序之后的數的值。 對于某一個數\(x\),設\(f_{x,i} (i \in [1,9])\)表示\(x\)中的所有數位的值\(\geq i\)的數位數量,比如說\(f_{6345982 , 7} 2 , f_…

銳捷亮相GITC:請互聯網企業為我點個贊!

【51CTO.com原創稿件】GITC全球互聯網技術大會已成功舉辦四屆,今年的會議現場依然是摩肩接踵圍觀者眾。圍繞互聯網熱點技術,眾人根據云、大數據、安全、運維、基礎架構的不同主題,各自聚成小圈子展開深入交流。 銳捷的展位在主會場的內側&…

c語言匯編混合編程方法,C語言和匯編語言混合編程方法

摘要: C語言是一種高級的面向過程的開發語言,匯編語言是一種低級的面向機器的編程語言。兩者在程序設計開發方面各有優劣,目前兩者的混合編程得到了廣泛的應用。本文通過具體的實例,說明了混合編程的基本方法,為C語言應…

WPF Slider設置整數

IsSnapToTickEnabled"True" 轉載于:https://www.cnblogs.com/Fred1987/p/6038608.html

api代理提取_了解提取API

api代理提取Interested in learning JavaScript? Get my ebook at jshandbook.com有興趣學習JavaScript嗎? 在jshandbook.com上獲取我的電子書 Since IE5 was released in 1998, we’ve had the option to make asynchronous network calls in the browser using X…

react.lazy 路由懶加載_React lazy/Suspense使用及源碼解析

React v16.6.0已經發布快一年了,為保障項目迭代發布,沒有及時更新react版本,最近由于開啟了新項目,于是使用新的react版本進行了項目開發。項目工程如何搭建,如何滿足兼容性要求,如何規范化等等這里不作為介…

Dart編程語言入門

Dart基礎入門語法介紹,詳細說明可以查看相關視頻《Dart編程語言入門》。 變量與常量 變量 1.使用 var 聲明變量,默認值為 null var a;//null a 10;2.顯示類型聲明 int a;//null a 10;3.使用 var 聲明,可賦予不同類型的值 var a; //null a 10; //int a…

《PHP精粹:編寫高效PHP代碼》——1.1節為什么要使用面向對象編程

本節書摘來自華章社區《PHP精粹:編寫高效PHP代碼》一書中的第1章,第1.1節為什么要使用面向對象編程,作者:(美)  Davey Shafik,更多章節內容可以訪問云棲社區“華章社區”公眾號查看 1.1 為什…

c語言數據結構系統化,C語言數據結構+數據庫+操作系統

http://cv.qiaobutang.com/post/55c419b20cf2009bd4607795第二部分是專業相關的C ,數據庫,操作系統,數據結構。http://c.biancheng.net/cpp/u/shuju/數據(Data)是信息的載體,它能夠被計算機識別、存儲和加工處理。它是計算機程序加…

c語言判斷一個序列是不是另一個的子序列

1 #include <stdio.h>2 #include <string.h>//添加字符串頭文件3 4 int Subsequence(char s[], char t[]) 5 {6 int m,n,i,j;7 n strlen(s); //n表示序列S的長度8 m strlen(t); //m表示序列T的長度9 i0; 10 j0; 11 if (m>…

linux中python如何調用matlab的數據_特征錦囊:如何在Python中處理不平衡數據

今日錦囊特征錦囊&#xff1a;如何在Python中處理不平衡數據? Index1、到底什么是不平衡數據2、處理不平衡數據的理論方法3、Python里有什么包可以處理不平衡樣本4、Python中具體如何處理失衡樣本印象中很久之前有位朋友說要我寫一篇如何處理不平衡數據的文章&#xff0c;整理…

源碼安裝zabbix遇到的報錯集錦

報錯1&#xff1a;checking for mysql_config... configure: error: MySQL library not found 解決辦法&#xff1a;查找mysql_config #find / -name "mysql_config*" /usr/local/mysql/bin/mysql_config 在配置時將原有的 --with-mysql 改為 --with-mysql/usr/loca…

pso算法c++語言代碼,一C++PSO(PSO)算法

收集和變化PSO算法&#xff0c;它可用于參考實施&#xff1a;#include #include #include #include #include #define rand_01 ((float)rand() / (float)RAND_MAX)const int numofdims 30;const int numofparticles 50;using namespace std;//typedef void (*FitnessFunc)(fl…

Hadoop不適合哪些場景 哪些場景適合?

Hadoop設計的目的主要包括下面幾個方面&#xff0c;也就是所謂的適用場景&#xff1a; 1&#xff1a;超大文件 可以是幾百M&#xff0c;幾百T這個級別的文件。 2&#xff1a;流式數據訪問 Hadoop適用于一次寫入&#xff0c;多次讀取的場景&#xff0c;也就是數據復制進去之后&a…

微服務 邊界服務_遵循這些實用原則以獲取精心設計的微服務邊界

微服務 邊界服務by Jake Lumetta杰克盧米塔(Jake Lumetta) 遵循這些實用原則以獲取精心設計的微服務邊界 (Follow these practical principles to get well-designed microservices boundaries) 如何避免使微服務太小和緊密耦合 (How to avoid making your microservices too …

ShareEntryActivity java.lang.ClassNotFoundException | Android類找不到問題

錯誤堆棧&#xff1a; Process: com.mci.smagazine, PID: 23265java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mci.smagazine/com.mci.smagazine.apshare.ShareEntryActivity}: java.lang.ClassNotFoundException: com.mci.smagazine.apshare…

阿里Android p6準備,項目經歷準備篇——如何準備阿里巴巴P6/P7前端面試

項目經歷準備篇——如何準備阿里巴巴P6/P7前端面試在上次的校招文章之后&#xff0c;有很多同學問有沒有社招相關的東西可以寫一篇&#xff0c;現在它來了。比起校招&#xff0c;社招更加看重項目經歷項目經歷反應的思考。本文針對的是想進入阿里的P6/P7同學&#xff0c;著重講…

for in for of區別_Python 第4課:for…in循環黃金搭檔之range()函數

樂學趣學Py● 04&#xff1a;for…in循環黃金搭檔之range()函數●Python趣味小百科Python中的繪圖模塊為什么叫Turtle海龜&#xff0c;而不是cat ,dog,bird呢&#xff1f;原來Python引用了麻省理工大學教授開發的logo海龜制圖語言,能通過繪圖直觀地教大家學習編程。實踐是最好的…