精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

設計模式系列—備忘錄模式

開發(fā) 前端
本篇和大家一起來學習備忘錄模式相關(guān)內(nèi)容。

 模式定義

在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài),以便以后當需要時能將該對象恢復到原先保存的狀態(tài)。該模式又叫快照模式。

模版實現(xiàn)如下:

  1. package com.niuh.designpattern.memento.v1; 
  2.  
  3. /** 
  4.  * <p> 
  5.  * 備忘錄模式 
  6.  * </p> 
  7.  */ 
  8. public class MementoPattern { 
  9.     public static void main(String[] args) { 
  10.         Originator or = new Originator(); 
  11.         Caretaker cr = new Caretaker(); 
  12.         or.setState("S0"); 
  13.         System.out.println("初始狀態(tài):" + or.getState()); 
  14.         cr.setMemento(or.createMemento()); //保存狀態(tài)       
  15.         or.setState("S1"); 
  16.         System.out.println("新的狀態(tài):" + or.getState()); 
  17.         or.restoreMemento(cr.getMemento()); //恢復狀態(tài) 
  18.         System.out.println("恢復狀態(tài):" + or.getState()); 
  19.     } 
  20.  
  21. //備忘錄 
  22. class Memento { 
  23.     private String state; 
  24.  
  25.     public Memento(String state) { 
  26.         this.state = state; 
  27.     } 
  28.  
  29.     public void setState(String state) { 
  30.         this.state = state; 
  31.     } 
  32.  
  33.     public String getState() { 
  34.         return state; 
  35.     } 
  36.  
  37. //發(fā)起人 
  38. class Originator { 
  39.     private String state; 
  40.  
  41.     public void setState(String state) { 
  42.         this.state = state; 
  43.     } 
  44.  
  45.     public String getState() { 
  46.         return state; 
  47.     } 
  48.  
  49.     public Memento createMemento() { 
  50.         return new Memento(state); 
  51.     } 
  52.  
  53.     public void restoreMemento(Memento m) { 
  54.         this.setState(m.getState()); 
  55.     } 
  56.  
  57. //管理者 
  58. class Caretaker { 
  59.     private Memento memento; 
  60.  
  61.     public void setMemento(Memento m) { 
  62.         memento = m; 
  63.     } 
  64.  
  65.     public Memento getMemento() { 
  66.         return memento; 
  67.     } 

輸出結(jié)果如下:

  1. 初始狀態(tài):S0 
  2. 新的狀態(tài):S1 
  3. 恢復狀態(tài):S0 

解決的問題

備忘錄模式能記錄一個對象的內(nèi)部狀態(tài),當用戶后悔時能撤銷當前操作,使數(shù)據(jù)恢復到它原先的狀態(tài)。

每個人都有犯錯誤的時候,都希望有種“后悔藥”能彌補自己的過失,讓自己重新開始,但現(xiàn)實是殘酷的。在計算機應用中,客戶同樣會常常犯錯誤,能否提供“后悔藥”給他們呢?當然是可以的,而且是有必要的。這個功能由“備忘錄模式”來實現(xiàn)。

模式組成

 

備忘錄模式的核心是設計備忘錄類以及用于管理備忘錄的管理者類。

實例說明

實例概況

 

以游戲存檔為例,看一下如何用備忘錄模式實現(xiàn)

使用步驟

 

步驟1:定義備忘錄角色,用于存儲角色狀態(tài)。

  1. class RoleStateMemento { 
  2.  
  3.     private int vit;    //生命力 
  4.     private int atk;    //攻擊力 
  5.     private int def;    //防御力 
  6.  
  7.     public RoleStateMemento(int vit, int atk, int def) { 
  8.         this.vit = vit; 
  9.         this.atk = atk; 
  10.         this.def = def; 
  11.     } 
  12.  
  13.     public int getVit() { 
  14.         return vit; 
  15.     } 
  16.  
  17.     public void setVit(int vit) { 
  18.         this.vit = vit; 
  19.     } 
  20.  
  21.     public int getAtk() { 
  22.         return atk; 
  23.     } 
  24.  
  25.     public void setAtk(int atk) { 
  26.         this.atk = atk; 
  27.     } 
  28.  
  29.     public int getDef() { 
  30.         return def; 
  31.     } 
  32.  
  33.     public void setDef(int def) { 
  34.         this.def = def; 
  35.     } 

步驟2:定義發(fā)起人角色(當前游戲角色),記錄當前游戲角色的生命力、攻擊力、防御力。通過saveState()方法來保存當前狀態(tài),通過recoveryState()方法來恢復角色狀態(tài)。

  1. class GameRole { 
  2.  
  3.     private int vit;    //生命力 
  4.     private int atk;    //攻擊力 
  5.     private int def;    //防御力 
  6.  
  7.     public int getVit() { 
  8.         return vit; 
  9.     } 
  10.  
  11.     public void setVit(int vit) { 
  12.         this.vit = vit; 
  13.     } 
  14.  
  15.     public int getAtk() { 
  16.         return atk; 
  17.     } 
  18.  
  19.     public void setAtk(int atk) { 
  20.         this.atk = atk; 
  21.     } 
  22.  
  23.     public int getDef() { 
  24.         return def; 
  25.     } 
  26.  
  27.     public void setDef(int def) { 
  28.         this.def = def; 
  29.     } 
  30.  
  31.     //狀態(tài)顯示 
  32.     public void stateDisplay() { 
  33.         System.out.println("角色當前狀態(tài):"); 
  34.         System.out.println("體力:" + this.vit); 
  35.         System.out.println("攻擊力:" + this.atk); 
  36.         System.out.println("防御力: " + this.def); 
  37.         System.out.println("-----------------"); 
  38.     } 
  39.  
  40.     //獲得初始狀態(tài) 
  41.     public void getInitState() { 
  42.         this.vit = 100; 
  43.         this.atk = 100; 
  44.         this.def = 100; 
  45.     } 
  46.  
  47.     //戰(zhàn)斗后 
  48.     public void fight() { 
  49.         this.vit = 0; 
  50.         this.atk = 0; 
  51.         this.def = 0; 
  52.     } 
  53.  
  54.     //保存角色狀態(tài) 
  55.     public RoleStateMemento saveState() { 
  56.         return (new RoleStateMemento(vit, atk, def)); 
  57.     } 
  58.  
  59.     //恢復角色狀態(tài) 
  60.     public void recoveryState(RoleStateMemento memento) { 
  61.         this.vit = memento.getVit(); 
  62.         this.atk = memento.getAtk(); 
  63.         this.def = memento.getDef(); 
  64.     } 

步驟3:定義管理者角色,角色狀態(tài)管理者

  1. class RoleStateCaretaker { 
  2.  
  3.     private RoleStateMemento memento; 
  4.  
  5.     public RoleStateMemento getMemento() { 
  6.         return memento; 
  7.     } 
  8.  
  9.     public void setMemento(RoleStateMemento memento) { 
  10.         this.memento = memento; 
  11.     } 

步驟4:測試輸出

  1. public class MementoPattern { 
  2.  
  3.     // 邏輯大致為打boss前存檔,打boss失敗了 
  4.     public static void main(String[] args) { 
  5.         //打boss前 
  6.         GameRole gameRole = new GameRole(); 
  7.         gameRole.getInitState(); 
  8.         gameRole.stateDisplay(); 
  9.  
  10.         //保存進度 
  11.         RoleStateCaretaker caretaker = new RoleStateCaretaker(); 
  12.         caretaker.setMemento(gameRole.saveState()); 
  13.  
  14.         //打boss失敗 
  15.         gameRole.fight(); 
  16.         gameRole.stateDisplay(); 
  17.  
  18.         //恢復狀態(tài) 
  19.         gameRole.recoveryState(caretaker.getMemento()); 
  20.         gameRole.stateDisplay(); 
  21.     } 

輸出結(jié)果

  1. 角色當前狀態(tài): 
  2. 體力:100 
  3. 攻擊力:100 
  4. 防御力: 100 
  5. ----------------- 
  6. 角色當前狀態(tài): 
  7. 體力:0 
  8. 攻擊力:0 
  9. 防御力: 0 
  10. ----------------- 
  11. 角色當前狀態(tài): 
  12. 體力:100 
  13. 攻擊力:100 
  14. 防御力: 100 

優(yōu)點

備忘錄模式是一種對象行為型模式,其主要優(yōu)點如下。

  • 提供了一種可以恢復狀態(tài)的機制。當用戶需要時能夠比較方便地將數(shù)據(jù)恢復到某個歷史的狀態(tài)。
  • 實現(xiàn)了內(nèi)部狀態(tài)的封裝。除了創(chuàng)建它的發(fā)起人之外,其他對象都不能夠訪問這些狀態(tài)信息。
  • 簡化了發(fā)起人類。發(fā)起人不需要管理和保存其內(nèi)部狀態(tài)的各個備份,所有狀態(tài)信息都保存在備忘錄中,并由管理者進行管理,這符合單一職責原則。

缺點

資源消耗大。如果要保存的內(nèi)部狀態(tài)信息過多或者特別頻繁,將會占用比較大的內(nèi)存資源。

注意事項

  1. 為了符合迪米特法則,需要有一個管理備忘錄的類
  2. 不要在頻繁建立備份的場景中使用備忘錄模式。為了節(jié)約內(nèi)存,可使用原型模式+備忘錄模式

應用場景

  1. 需要保存和恢復數(shù)據(jù)的相關(guān)場景
  2. 提供一個可回滾的操作,如ctrl+z、瀏覽器回退按鈕、Backspace鍵等
  3. 需要監(jiān)控的副本場景

模式的擴展

 

在備忘錄模式中,有單狀態(tài)備份的例子,也有多狀態(tài)備份的例子??梢越Y(jié)合原型模式混合使用。在備忘錄模式中,通過定義“備忘錄”來備份“發(fā)起人”的信息,而原型模式的 clone() 方法具有自備份功能,所以,如果讓發(fā)起人實現(xiàn) Cloneable 接口就有備份自己的功能,這時可以刪除備忘錄類,其結(jié)構(gòu)如下:

源碼中的應用

  1. #Spring 
  2. org.springframework.binding.message.StateManageableMessageContext 

StateManageableMessageContext 部分源碼

  1. public interface StateManageableMessageContext extends MessageContext { 
  2.  
  3.    /** 
  4.     * Create a serializable memento, or token representing a snapshot of the internal state of this message context. 
  5.     * @return the messages memento 
  6.     */ 
  7.    public Serializable createMessagesMemento(); 
  8.  
  9.    /** 
  10.     * Set the state of this context from the memento provided. After this call, the messages in this context will match 
  11.     * what is encapsulated inside the memento. Any previous state will be overridden. 
  12.     * @param messagesMemento the messages memento 
  13.     */ 
  14.    public void restoreMessages(Serializable messagesMemento); 
  15.  
  16.    /** 
  17.     * Configure the message source used to resolve messages added to this context. May be set at any time to change how 
  18.     * coded messages are resolved. 
  19.     * @param messageSource the message source 
  20.     * @see MessageContext#addMessage(MessageResolver) 
  21.     */ 
  22.    public void setMessageSource(MessageSource messageSource); 

PS:以上代碼提交在 Github :

https://github.com/Niuh-Study/niuh-designpatterns.git

責任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2023-10-07 00:14:53

2024-05-15 17:41:37

備忘錄模式多線程

2023-10-31 09:07:16

備忘錄模式保存

2023-04-19 08:03:52

Go設計模式

2025-02-17 14:48:14

2018-12-24 21:40:12

2011-08-16 18:38:23

Core Animat動畫

2017-03-21 11:02:59

基礎深度學習備忘錄

2011-04-11 10:03:32

錢伯斯思科

2023-10-10 15:26:30

內(nèi)存泄露OOM

2014-04-17 10:30:41

Linux 命令黑白備忘錄

2020-11-03 13:05:18

命令模式

2020-11-04 08:54:54

狀態(tài)模式

2020-10-23 09:40:26

設計模式

2022-01-12 13:33:25

工廠模式設計

2016-03-03 10:09:26

2013-08-29 10:50:48

移動網(wǎng)站性能優(yōu)化移動web

2018-06-20 13:14:16

MySQL數(shù)據(jù)優(yōu)化查詢備忘錄

2020-10-20 13:33:00

建造者模式

2012-01-13 15:59:07

點贊
收藏

51CTO技術(shù)棧公眾號

在线一区日本视频| 国产精品夜色7777狼人| 自拍视频一区二区| 亚洲成av在线| 亚洲欧美一区二区在线观看| 91丝袜脚交足在线播放| 亚洲精品午夜国产va久久成人| 国产欧美高清视频在线| 7777精品伊人久久久大香线蕉超级流畅| 国产精品日韩三级| 九色视频在线观看免费播放| 国内精品久久久久影院色| 国产做受高潮69| 成年人看的免费视频| 51亚洲精品| 在线免费观看日本一区| cao在线观看| jizz在线观看| 99re热这里只有精品免费视频| 国产精品自拍偷拍| 男人的天堂一区| 午夜久久免费观看| 亚洲午夜精品久久久久久性色| 色姑娘综合天天| av激情成人网| 亚洲成a人在线观看| 亚洲自拍的二区三区| 天天综合网天天综合| 国产一区二区在线观看免费| 热久久这里只有精品| 久久综合成人网| 久久精品高清| 亚洲亚裔videos黑人hd| 极品白嫩的小少妇| 国产视频一区二区在线播放| 日本高清免费不卡视频| 国产97在线 | 亚洲| 丝袜综合欧美| 亚洲视频免费在线观看| 日韩av在线一区二区三区| 国产福利小视频| 日韩专区中文字幕一区二区| 97免费中文视频在线观看| 一区二区国产精品精华液| 欧美一区三区| 亚洲日韩中文字幕| 女同毛片一区二区三区| 国产一区二区三区不卡av| 精品精品国产高清一毛片一天堂| 亚洲视频一二三四| 青青青国产精品| 欧美在线观看视频一区二区三区| 男人天堂999| 在线播放高清视频www| 亚洲成人免费在线观看| 草b视频在线观看| 国内在线免费视频| 亚欧色一区w666天堂| 丁香色欲久久久久久综合网| 国产深夜视频在线观看| 一区二区三区免费在线观看| 四虎免费在线观看视频| 国产激情视频在线| 亚洲九九爱视频| 蜜桃网站在线观看| 色爱综合区网| 亚洲成av人片在线观看| www.玖玖玖| 成人在线爆射| 欧美日韩综合不卡| 国产女同无遮挡互慰高潮91| 国产精品1区在线| 日韩精品在线网站| 久久久久久婷婷| 伊人久久大香线蕉av不卡| 亚洲美女喷白浆| 女人裸体性做爰全过| 国产精品久久久久无码av| 欧美成人免费播放| 国产香蕉视频在线| 日韩精品91亚洲二区在线观看| 国产精品久久久久久网站| 91精品国产综合久| 国产成人午夜99999| 好吊色欧美一区二区三区| 男人天堂资源在线| 国产精品免费免费| 国产精品三级一区二区| 最近高清中文在线字幕在线观看1| 色哟哟国产精品| 日本在线播放一区二区| 白白在线精品| 伊人久久久久久久久久久久久| 国产探花在线视频| 亚洲每日在线| 国产精品视频地址| 懂色av蜜臀av粉嫩av分享吧| 久久嫩草精品久久久精品| 一级二级三级欧美| 国产乱码午夜在线视频| 欧美日韩国产一区| bl动漫在线观看| 三级电影一区| 6080yy精品一区二区三区| 中文字幕免费观看视频| 成人免费av在线| 亚洲精品一区二区三区四区五区| 欧美性video| 欧美性色欧美a在线播放| 国产成人av免费观看| 成人激情电影在线| 97精品久久久| 国产视频一区二区三区四区五区| 久久在线观看免费| 一二三四中文字幕| 欧美性片在线观看| 亚洲精品在线电影| 糖心vlog免费在线观看| 精品动漫3d一区二区三区免费版 | 国产成人精品免费视频大全最热| 四虎影视在线播放| 有码一区二区三区| 亚洲精品自拍网| 亚洲成aⅴ人片久久青草影院| 欧美xxxx做受欧美.88| 天天天天天天天干| 久久综合精品国产一区二区三区| 在线观看17c| 欧洲精品久久久久毛片完整版| 亚洲精品一区二区网址 | 污片在线观看一区二区| 99久久99精品| 成人三级视频| 国产99视频在线观看| 欧美特级特黄aaaaaa在线看| 亚洲精品中文字幕在线观看| 午夜免费看视频| 国产免费久久| 日韩美女av在线免费观看| 手机看片国产1024| 五月婷婷久久综合| 怡红院一区二区| 国产一区久久| 成人精品一区二区三区| 亚洲欧美视频一区二区| 欧美视频在线观看一区二区| 免费看黄色的视频| 久久精品中文| 欧美日韩精品一区| 手机看片久久| 亚洲欧洲在线看| 999视频在线| 国产亲近乱来精品视频| 蜜臀久久99精品久久久酒店新书 | 亚洲精品影视在线观看| 欧美一级视频免费观看| 播五月开心婷婷综合| 很污的网站在线观看| 国产欧美一区二区三区米奇| 久久久久久午夜| 深爱五月激情五月| 亚洲3atv精品一区二区三区| 免费成人深夜夜行p站| 久久xxxx精品视频| 日本免费高清一区二区| 91九色综合| 久久精品99久久香蕉国产色戒| 国产美女明星三级做爰| 一区二区三区小说| 国产精品无码在线| 三级一区在线视频先锋 | 亚洲自拍中文字幕| 一二三四区在线观看| 亚洲第一精品夜夜躁人人躁| 成人毛片18女人毛片| 久久九九国产精品| 永久免费的av网站| 国产精品激情| 日本黄网免费一区二区精品| 视频欧美精品| 久久久久久久久久国产精品| 亚洲 欧美 精品| 欧美日免费三级在线| 免费人成在线观看| 91视频.com| 亚洲精品第三页| 国产综合精品| 日韩精品一区二区三区外面| 成人激情久久| **欧美日韩vr在线| 日本在线www| 亚洲国产一区二区三区四区| 国产情侣免费视频| 亚洲自拍偷拍综合| 手机毛片在线观看| 成人国产在线观看| 99sesese| 亚洲深夜福利| 一级黄色片播放| 伊人久久大香线蕉| 99九九电视剧免费观看| 欧美在线va视频| 久久久久久成人| 在线观看国产原创自拍视频| 亚洲电影免费观看高清| 一级二级三级视频| 欧美日韩中文字幕日韩欧美| 亚洲色婷婷一区二区三区| 久久久久99精品一区| 一级黄色大片免费看| 奇米影视7777精品一区二区| 91免费黄视频| 亚洲欧美综合久久久| 日本不卡在线观看| 激情小说亚洲色图| 成人深夜直播免费观看| 色老太综合网| 97在线观看视频| 中文字幕在线三区| 色悠悠久久久久| 精品推荐蜜桃传媒| 亚洲国产91色在线| 国产jzjzjz丝袜老师水多| 欧美伊人久久大香线蕉综合69| 豆国产97在线 | 亚洲| 1024成人网色www| 手机毛片在线观看| 久久久久久久精| 在线黄色免费网站| 成人精品视频一区| 自拍视频第一页| 国产原创一区二区| 日本超碰在线观看| 日韩中文字幕麻豆| 久久久久久久久久久免费视频| 亚洲高清av| 人人妻人人做人人爽| 激情综合激情| 久无码久无码av无码| 欧美三级在线| 免费看毛片的网址| 激情偷拍久久| 六月丁香激情网| 国产一区二区你懂的| 18禁免费观看网站| 一区二区久久| 国产91在线视频观看| 国产九九精品| 国产又大又硬又粗| 日韩精品免费专区| 亚洲污视频在线观看| 欧美aⅴ一区二区三区视频| 国产区二区三区| 免费不卡在线视频| 五月天激情播播| 国产一区二区三区国产| 欧美熟妇另类久久久久久多毛| 国产一区二区三区在线观看精品| 国产精品久久久久久久99| 国产一区二区电影| wwwww在线观看| 成人免费毛片片v| 一级国产黄色片| 久久久精品黄色| 欧美激情视频二区| 自拍偷在线精品自拍偷无码专区 | 国产欧美一区二区三区四区| 欧美xxxx性| 99免费在线观看视频| 久久a级毛片毛片免费观看| 久久综合九色综合久99| re久久精品视频| 男女激烈动态图| 在线播放亚洲| 日韩 欧美 高清| 蜜乳av一区二区| 国产性猛交96| 久久精品免视看| 内射一区二区三区| 天天影视涩香欲综合网 | 日韩视频一区二区三区| 天堂在线观看av| 夜夜嗨av一区二区三区四区 | 亚洲婷婷丁香| 亚洲欧美国产一区二区| 欧美日韩1区| 亚洲人成无码www久久久| 久久成人麻豆午夜电影| 美国黄色一级视频| 欧美国产激情一区二区三区蜜月| 五月天激情丁香| 午夜私人影院久久久久| jizz国产在线| 日韩欧美国产综合一区| 激情在线视频| 欧美激情精品久久久久久久变态| 北岛玲heyzo一区二区| 91探花福利精品国产自产在线| 欧美1区二区| 免费看av软件| 免费亚洲婷婷| 中文字幕亚洲日本| 欧美激情综合网| 国产又大又黑又粗免费视频| 欧美一a一片一级一片| 日韩一区免费视频| 久久精品中文字幕| 怡红院成人在线| 精品国产二区在线| 亚洲国产一区二区三区在线播放 | 伊人久久国产| 亚洲综合在线播放| 成人羞羞动漫| 99爱视频在线| gogo大胆日本视频一区| 性色国产成人久久久精品 | 91精品国自产| 亚洲人成五月天| 久草免费在线色站| 91色中文字幕| 日韩免费特黄一二三区| 欧美精品一区二区三区免费播放| 岛国av在线一区| 少妇aaaaa| 欧美绝品在线观看成人午夜影视| 人操人视频在线观看| 欧美精品激情视频| 秋霞午夜一区二区三区视频| 伊甸园精品99久久久久久| 日韩综合小视频| 日韩精品电影一区二区| 午夜一区二区三区在线观看| 亚洲AV午夜精品| 久久国产色av| 久久综合偷偷噜噜噜色| 在线观看福利一区| 久久av资源网| 亚洲AV成人无码网站天堂久久| 91黄色免费网站| 天堂av在线免费观看| 91精品国产91久久久久福利| 国产精品17p| 国产一区二区四区| 成人白浆超碰人人人人| 久久精品国产亚洲AV无码男同| 欧美一区二区免费观在线| 最新黄网在线观看| 亚洲v日韩v综合v精品v| 欧美在线首页| 韩国三级在线看| 亚洲高清免费观看| 婷婷丁香花五月天| 55夜色66夜色国产精品视频| 亚洲欧洲av| 天天插天天操天天射| 国产精品传媒入口麻豆| 国产孕妇孕交大片孕| 欧美xxxx综合视频| 成人av综合网| 日本手机在线视频| 久久综合视频网| 国产成人自拍偷拍| 麻豆国产精品va在线观看不卡| 国产免费av国片精品草莓男男| 超碰97在线看| av激情综合网| 久久永久免费视频| 久久九九热免费视频| 成人性生交大片免费看96| 久久久999免费视频| 欧美韩国日本综合| 国产欧美一区二区三区视频在线观看| 欧美刺激性大交免费视频| 亚洲大奶少妇| 国产又大又硬又粗| 中文字幕视频一区| 日本高清视频在线| 国产精品高潮在线| 欧美在线免费一级片| 国产精品无码电影| 欧美日韩在线综合| 蜜臀av国内免费精品久久久夜夜| 国产综合 伊人色| 日韩av一二三| 久久久国产精品黄毛片| 亚洲欧洲午夜一线一品| 99精品视频在线免费播放| 日韩日韩日韩日韩日韩| 日本一区二区三区四区在线视频| 国产情侣av在线| 日韩美女免费视频| 牛夜精品久久久久久久99黑人| 色噜噜在线观看| 欧美顶级少妇做爰| 亚洲小少妇裸体bbw| 亚洲av首页在线| 久久人人爽爽爽人久久久| 国产免费福利视频| 日韩av电影手机在线观看| 欧美黄色大片网站|