備忘錄模式(Memento) 行為筆記

2021-07-27 07:22:45 字數 3256 閱讀 6787

備忘錄(

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類是原始...