備忘錄模式
http://www.cnblogs.com/java-my-life/archive/2012/06/06/2534942.html
備忘錄模式又叫做快照模式(Snapshot Pattern)或Token模式,是物件的行為模式。
備忘錄物件是一個用來儲存另外一個物件內部狀態的快照的物件。備忘錄模式的用意是在不破壞封裝的條件下,將一個物件的狀態捕捉(Capture)住,並外部化,儲存起來,從而可以在將來合適的時候把這個物件還原到儲存起來的狀態。備忘錄模式常常與命令模式和迭代子模式一同使用。
備忘錄模式所涉及的角色有三個:備忘錄(Memento)角色、發起人(Originator)角色、負責人(Caretaker)角色。
備忘錄(Memento)角色
備忘錄角色又如下責任:
(1)將發起人(Originator)物件的內戰狀態儲存起來。備忘錄可以根據發起人物件的判斷來決定儲存多少發起人(Originator)物件的內部狀態。
(2)備忘錄可以保護其內容不被髮起人(Originator)物件之外的任何物件所讀取。
備忘錄有兩個等效的介面:
● 窄介面:負責人(Caretaker)物件(和其他除發起人物件之外的任何物件)看到的是備忘錄的窄介面(narrow interface),這個窄介面只允許它把備忘錄物件傳給其他的物件。
● 寬介面:與負責人物件看到的窄介面相反的是,發起人物件可以看到一個寬介面(wide interface),這個寬介面允許它讀取所有的資料,以便根據這些資料恢復這個發起人物件的內部狀態。
發起人(Originator)角色
發起人角色有如下責任:
(1)建立一個含有當前的內部狀態的備忘錄物件。
(2)使用備忘錄物件儲存其內部狀態。
負責人(Caretaker)角色
負責人角色有如下責任:
(1)負責儲存備忘錄物件。
(2)不檢查備忘錄物件的內容。
白箱實現:
黑箱實現.(就是將備忘錄物件設定為內部類,對外提供一個標記介面)
備忘錄模式又叫做快照模式(Snapshot Pattern)或Token模式,是物件的行為模式。
備忘錄物件是一個用來儲存另外一個物件內部狀態的快照的物件。備忘錄模式的用意是在不破壞封裝的條件下,將一個物件的狀態捕捉(Capture)住,並外部化,儲存起來,從而可以在將來合適的時候把這個物件還原到儲存起來的狀態。備忘錄模式常常與命令模式和迭代子模式一同使用。
備忘錄模式所涉及的角色有三個:備忘錄(Memento)角色、發起人(Originator)角色、負責人(Caretaker)角色。
備忘錄(Memento)角色
備忘錄角色又如下責任:
(1)將發起人(Originator)物件的內戰狀態儲存起來。備忘錄可以根據發起人物件的判斷來決定儲存多少發起人(Originator)物件的內部狀態。
(2)備忘錄可以保護其內容不被髮起人(Originator)物件之外的任何物件所讀取。
備忘錄有兩個等效的介面:
● 窄介面:負責人(Caretaker)物件(和其他除發起人物件之外的任何物件)看到的是備忘錄的窄介面(narrow interface),這個窄介面只允許它把備忘錄物件傳給其他的物件。
● 寬介面:與負責人物件看到的窄介面相反的是,發起人物件可以看到一個寬介面(wide interface),這個寬介面允許它讀取所有的資料,以便根據這些資料恢復這個發起人物件的內部狀態。
發起人(Originator)角色
發起人角色有如下責任:
(1)建立一個含有當前的內部狀態的備忘錄物件。
(2)使用備忘錄物件儲存其內部狀態。
負責人(Caretaker)角色
負責人角色有如下責任:
(1)負責儲存備忘錄物件。
(2)不檢查備忘錄物件的內容。
白箱實現:
- public class Test {
- public static void main(String[] args) {
- Originator o = new Originator();
- Caretaker c = new Caretaker();
- // 改變負責人物件的狀態
- o.setState("On");
- // 建立備忘錄物件,並將發起人物件的狀態儲存起來
- c.saveMemento(o.createMemento());
- // 修改發起人的狀態
- o.setState("Off");
- // 恢復發起人物件的狀態
- o.restoreMemento(c.retrieveMemento());
- System.out.println(o.getState());
- }
- }
- class Originator {
- private String state;
- /**
- * 工廠方法,返回一個新的備忘錄物件
- */
- public Memento createMemento() {
- return new Memento(state);
- }
- /**
- * 將發起人恢復到備忘錄物件所記載的狀態
- */
- public void restoreMemento(Memento memento) {
- this.state = memento.getState();
- }
- public String getState() {
- return state;
- }
- public void setState(String state) {
- this.state = state;
- System.out.println("當前狀態:" + this.state);
- }
- }
- class Memento {
- private String state;
- public Memento(String state) {
- this.state = state;
- }
- public String getState() {
- return state;
- }
- public void setState(String state) {
- this.state = state;
- }
- }
- class Caretaker {
- private Memento memento;
- /**
- * 備忘錄的取值方法
- */
- public Memento retrieveMemento() {
- return this.memento;
- }
- /**
- * 備忘錄的賦值方法
- */
- public void saveMemento(Memento memento) {
- this.memento = memento;
- }
- }
黑箱實現.(就是將備忘錄物件設定為內部類,對外提供一個標記介面)
- public class Test {
- public static void main(String[] args) {
- Originator o = new Originator();
- Caretaker c = new Caretaker();
- // 改變負責人物件的狀態
- o.setState("On");
- // 建立備忘錄物件,並將發起人物件的狀態儲存起來
- c.saveMemento(o.createMemento());
- // 修改發起人物件的狀態
- o.setState("Off");
- // 恢復發起人物件的狀態
- o.restoreMemento(c.retrieveMemento());
- }
- }
- class Originator {
- private String state;
- public String getState() {
- return state;
- }
- public void setState(String state) {
- this.state = state;
- System.out.println("賦值狀態:" + state);
- }
- /**
- * 工廠方法,返還一個新的備忘錄物件
- */
- public MementoIF createMemento() {
- return new Memento(state);
- }
- /**
- * 發起人恢復到備忘錄物件記錄的狀態
- */
- public void restoreMemento(MementoIF memento) {
- this.setState(((Memento) memento).getState());
- }
- private class Memento implements MementoIF {
- private String state;
- /**
- * 構造方法
- */
- private Memento(String state) {
- this.state = state;
- }
- private String getState() {
- return state;
- }
- private void setState(String state) {
- this.state = state;
- }
- }
- }
- interface MementoIF {
- }
- class Caretaker {
- private MementoIF memento;
- /**
- * 備忘錄取值方法
- */
- public MementoIF retrieveMemento() {
- return memento;
- }
- /**
- * 備忘錄賦值方法
- */
- public void saveMemento(MementoIF memento) {
- this.memento = memento;
- }
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2135899/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 設計模式----備忘錄模式設計模式
- 設計模式 - 備忘錄模式設計模式
- 備忘錄模式(Memento)模式
- JavaMementoPattern(備忘錄模式)Java模式
- 19_備忘錄模式模式
- 行為型模式:備忘錄模式模式
- Java備忘錄模式(Memento模式)Java模式
- 設計模式(十九):備忘錄模式設計模式
- 設計模式之備忘錄模式設計模式
- 第 22 章 備忘錄模式模式
- 簡說設計模式——備忘錄模式設計模式
- 設計模式 - 備忘錄模式 ( Memento )設計模式
- 極簡設計模式-備忘錄模式設計模式
- GoLang設計模式11 - 備忘錄模式Golang設計模式
- Python設計模式-備忘錄模式Python設計模式
- 大話設計模式—備忘錄模式設計模式
- Android備忘錄《單例模式》Android單例模式
- 設計模式漫談之備忘錄模式設計模式
- java設計模式-備忘錄模式(Memento)Java設計模式
- 23種設計模式之備忘錄模式設計模式
- 折騰Java設計模式之備忘錄模式Java設計模式
- 設計模式 | 備忘錄模式及典型應用設計模式
- 19.java設計模式之備忘錄模式Java設計模式
- 備忘錄設計模式知識概括設計模式
- 備忘錄
- 【備忘錄】
- iOS設計模式之四:備忘錄模式和命令模式iOS設計模式
- 行為型設計模式 - 備忘錄模式詳解設計模式
- C#設計模式系列:備忘錄模式(Memento)C#設計模式
- 設計模式--備忘錄模式Memento(行為型)設計模式
- JAVA設計模式之 備忘錄模式【Memento Pattern】Java設計模式
- Android原始碼分析之備忘錄模式Android原始碼模式
- 抽絲剝繭——備忘錄設計模式設計模式
- iOS備忘錄iOS
- JUnit備忘錄
- CSS備忘錄CSS
- RabbitMQ備忘錄MQ
- Rust語言之GoF設計模式:備忘錄Memento模式RustGo設計模式