# 備忘錄模式
Memento,在不破壞對象封裝性的前提下在對象外保存對象的某個狀態,以便在需要的時候將該對象恢復到該狀態。備忘錄模式可以用在需要保存或者恢復數據的相關狀態場景下,或者提供一個回滾操作(數據庫事務)。
## 組件
1. Memento:包含了要被恢復的對象的狀態。
2. Originator:將狀態存儲進Memento中。
3. Caretaker:負責從 Memento 中恢復對象的狀態。
:-: 
## 實現
1. 創建Memento類
~~~
?package net.smrobot.menento;
??
?/**
? * 備忘錄模式
? * 備忘錄類:包含要恢復的對象的狀態
? */
??
?public class Memento {
? ? ?private String state;
? ? ?
? ? ?public Memento(String state) {
? ? ? ? ?this.state = state;
? ? }
? ? ?
? ? ?public String getState() {
? ? ? ? ?return state;
? ? }
?}
??
~~~
2. 創建Originator類
~~~
?package net.smrobot.menento;
??
?/**
? * 源對象
? * 在Memento對象中存儲狀態
? */
?public class Originator {
??
? ? ?private String state;
??
? ? ?public String getState() {
? ? ? ? ?return this.state;
? ? }
??
? ? ?public void setState(String state) {
? ? ? ? ?this.state = state;
? ? }
??
? ? ?/**
? ? ? * 將狀態存儲到Memento中
? ? ? * @param state
? ? ? * @return
? ? ? */
? ? ?public Memento saveStateToMemento(String state) {
? ? ? ? ?return new Memento(state);
? ? }
??
? ? ?/**
? ? ? * 從Memento中獲取狀態
? ? ? * @param memento
? ? ? */
? ? ?public void getStateFromMemento(Memento memento) {
? ? ? ? ?this.state = memento.getState();
? ? }
??
?}
??
~~~
3. 創建Caretaker類
~~~
?package net.smrobot.menento;
??
?import java.util.ArrayList;
?import java.util.List;
??
?/**
? * 負責從Memento中恢復對象的狀態
? */
?public class Caretaker {
??
? ? ?private List<Memento> mementoList = new ArrayList<>();
??
? ? ?public void add(Memento memento) {
? ? ? ? ?mementoList.add(memento);
? ? }
??
? ? ?public Memento get(int index) {
? ? ? ? ?if (index < 0 || index >= mementoList.size()) {
? ? ? ? ? ? ?return null;
? ? ? ? }
? ? ? ? ?return mementoList.get(index);
? ? }
??
?}
??
~~~
備忘錄模式其實就是在要保存狀態的對象中添加兩個方法用戶將狀態保留進備忘錄中或者從備忘錄中獲取狀態。然后將所有的備忘錄添加到一個容器進行維護。
- 第一章 Java基礎
- ThreadLocal
- Java異常體系
- Java集合框架
- List接口及其實現類
- Queue接口及其實現類
- Set接口及其實現類
- Map接口及其實現類
- JDK1.8新特性
- Lambda表達式
- 常用函數式接口
- stream流
- 面試
- 第二章 Java虛擬機
- 第一節、運行時數據區
- 第二節、垃圾回收
- 第三節、類加載機制
- 第四節、類文件與字節碼指令
- 第五節、語法糖
- 第六節、運行期優化
- 面試常見問題
- 第三章 并發編程
- 第一節、Java中的線程
- 第二節、Java中的鎖
- 第三節、線程池
- 第四節、并發工具類
- AQS
- 第四章 網絡編程
- WebSocket協議
- Netty
- Netty入門
- Netty-自定義協議
- 面試題
- IO
- 網絡IO模型
- 第五章 操作系統
- IO
- 文件系統的相關概念
- Java幾種文件讀寫方式性能對比
- Socket
- 內存管理
- 進程、線程、協程
- IO模型的演化過程
- 第六章 計算機網絡
- 第七章 消息隊列
- RabbitMQ
- 第八章 開發框架
- Spring
- Spring事務
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 數據庫
- Mysql
- Mysql中的索引
- Mysql中的鎖
- 面試常見問題
- Mysql中的日志
- InnoDB存儲引擎
- 事務
- Redis
- redis的數據類型
- redis數據結構
- Redis主從復制
- 哨兵模式
- 面試題
- Spring Boot整合Lettuce+Redisson實現布隆過濾器
- 集群
- Redis網絡IO模型
- 第十章 設計模式
- 設計模式-七大原則
- 設計模式-單例模式
- 設計模式-備忘錄模式
- 設計模式-原型模式
- 設計模式-責任鏈模式
- 設計模式-過濾模式
- 設計模式-觀察者模式
- 設計模式-工廠方法模式
- 設計模式-抽象工廠模式
- 設計模式-代理模式
- 第十一章 后端開發常用工具、庫
- Docker
- Docker安裝Mysql
- 第十二章 中間件
- ZooKeeper