備忘錄(
memento)物件:乙個用來儲存另外乙個物件內部狀態(資訊)的快照的物件
用意:在不破壞 封裝 的條件下,捕捉乙個物件的狀態(資訊),並外部化儲存起來,從而可以在將來合適的時候把物件還原到儲存起來的狀態。
一、涉及角色:
a)
發起人(
originator):建立乙個含有當前的內部 資訊(狀態)的備忘錄(memento)物件。使用備忘錄物件儲存其內部資訊(狀態);
b)
備忘錄(
memento):備忘錄儲存原
發起人(originator)
物件的內部狀態。
c)負責人(caretaker):負責儲存好備忘錄,不能對備忘錄的內容進行操作或檢查。
二、備忘錄模式優點
1、有時發起人物件的內部資訊(狀態)必須儲存在發起人物件以處的地方,但是必須要由發起人物件自己讀取,使用備忘錄可以把複雜的發起人內部資訊對其他的物件遮蔽起來,從而可以恰當保持封裝的邊界。
2、簡化發起人(originator)類。發起人(originator)不再需要管理和儲存其內部狀態的乙個個版本,客戶端可以自行管理它們所需要的這些狀態的版本
3、當發起人角色的狀態改變時,有可能這個狀態無效,這時候就可以使用暫時儲存起來備忘錄將狀態復原
缺點:
如果發起人的狀態需要完整儲存到備忘錄物件中,過於消耗資源
三、故事說明
state
狀態模式:狀態模式允許乙個物件在其內部狀態改變的時候改變行為。這個物件看上去象是改變了它的類一樣。狀態模式把所研究的物件的行為包裝在不同的狀態物件裡,每乙個狀態物件都屬於乙個抽象狀態類的乙個子類。狀態模式的意圖是讓乙個物件在其內部狀態改變的時候,其行為也隨之改變。狀態模式需要對每乙個系統可能取得的狀態創立乙個狀態類的子類。當系統的狀態變化時,系統便改變所選的子類。
發起人(originator)
public class originator
public memento creatememento()
public void setmememto(memento memento)
public string getstate()
public void setstate(string state)
}
備忘錄物件
public class memento
public string getstate()
public void setstate(string state)
}
負責人物件
public class caretaker
public memento getmemento()
}
public class client
}
四、多重檢查點可以儲存多個狀態,將發起人物件的狀態儲存到備忘錄物件裡面,備忘錄模式將發起人恢復到所儲存的某乙個檢查點。
發起人的狀態存在於乙個vector物件中,每乙個狀態都有乙個指數index,叫做檢查點指數,
注意:備忘錄的構造方法中轉殖了傳入的statelist,然後將轉殖存入備忘內部,非常重要,不然會造成客戶端和備忘錄物件持有對同乙個vector物件的引用,
//發起人物件
public class originator
/*工廠方法,建立備忘錄物件*/
public memento creatememento()
/*--將發起人恢復到備忘錄物件記錄的狀態--*/
public void restorememento(memento memento)
/*--狀態的賦值方法--*/
public void setstate(string state)
/*--列印狀態--*/
public void printstates()
}}
/*備忘錄物件*/
public class memento
public vector getstatelist()
public void setstatelist(vector statelist)
public int getindex()
public void setindex(int index)
}
//負責人物件
public class caretaker
/*--建立乙個新檢查點--*/
public int createmementor()
/*--將發起人恢復到某個檢查點--*/
public void restorememento(int index)
/*--將某個檢查點刪除--*/
public void removememento(int index)
}
public class client
}
列印的資訊
---->狀態總數:3
狀態:0
狀態:1
狀態:2
---下面是恢復到狀態:1----
---->狀態總數:2
狀態:0
狀態:1
---下面是恢復到狀態:2----
---->狀態總數:3
狀態:0
狀態:1
狀態:2
Memento(備忘錄) 物件行為模式
意圖 在不破壞封裝的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。單就實現儲存乙個物件在某一時刻的狀態的功能,還是很簡單的 將物件中要儲存的屬性放到乙個專門管理備份列表的的物件中,需要的時候則調從備份的列表中將該物件的屬性放回去。但是為了能讓你...
Memento備忘錄模式(行為型模式)
物件狀態的回溯 物件狀態的變化無端,如何回溯 恢復物件在某個點的狀態?動機在軟體構建過程中,某些物件的狀態在轉換過程中,可能由於某種需要,需求程式能夠回溯到物件之前處於某個點時的狀態。如果使用一些公有介面來讓其他物件得到物件的狀態,便會暴露物件的細節實現。如何實現物件狀態的良好儲存與恢復?但同時又不...
備忘錄模式(Memento)
主要目的是儲存乙個物件的某個狀態,以便在適當的時候恢復物件,個人覺得叫備份模式更形象些,通俗的講下 假設有原始類a,a中有各種屬性,a可以決定需要備份的屬性,備忘錄類b是用來儲存a的一些內部狀態,類c呢,就是乙個用來儲存備忘錄的,且只能儲存,不能修改等操作。做個圖來分析一下 original類是原始...