深入理解設計模式(16) 備忘錄模式

2022-05-26 15:54:07 字數 3452 閱讀 7966

備忘錄模式(memento pattern)又叫做快照模式(snapshot pattern)或token模式,是gof的23種設計模式之一,屬於行為模式。

定義:在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。

該模式用於儲存物件當前狀態,並且在之後可以再次恢復到此狀態。備忘錄模式實現的方式需要保證被儲存的物件狀態不能被物件從外部訪問,

目的是為了保護被儲存的這些物件狀態的完整性以及內部實現不向外暴露

涉及角色:

1.originator(發起人):負責建立乙個備忘錄memento,用以記錄當前時刻自身的內部狀態,並可使用備忘錄恢復內部狀態。originator可以根據需要決定memento儲存自己的哪些內部狀態。

2.memento(備忘錄):負責儲存originator物件的內部狀態,並可以防止originator以外的其他物件訪問備忘錄。備忘錄有兩個介面:caretaker只能看到備忘錄的窄介面,他只能將備忘錄傳遞給其他物件。originator卻可看到備忘錄的寬介面,允許它訪問返回到先前狀態所需要的所有資料。

3.caretaker(管理者):負責備忘錄memento,不能對memento的內容進行訪問或者操作。

需要儲存和恢復資料的相關狀態場景。

提供乙個可回滾(rollback)的操作。

資料庫連線的事務管理就是用的備忘錄模式。

優點

1、有時一些發起人物件的內部資訊必須儲存在發起人物件以外的地方,但是必須要由發起人物件自己讀取,這時,使用備忘錄模式可以把複雜的發起人內部資訊對其他的物件遮蔽起來,從而可以恰當地保持封裝的邊界。

2、本模式簡化了發起人類。發起人不再需要管理和儲存其內部狀態的乙個個版本,客戶端可以自行管理他們所需要的這些狀態的版本。

3、當發起人角色的狀態改變的時候,有可能這個狀態無效,這時候就可以使用暫時儲存起來的備忘錄將狀態復原。

缺點

1、如果發起人角色的狀態需要完整地儲存到備忘錄物件中,那麼在資源消耗上面備忘錄物件會很昂貴。

2、當負責人角色將乙個備忘錄 儲存起來的時候,負責人可能並不知道這個狀態會占用多大的儲存空間,從而無法提醒使用者乙個操作是否很昂貴。

3、當發起人角色的狀態改變的時候,有可能這個協議無效。如果狀態改變的成功率不高的話,不如採取「假如」協議模式。

例項:備份**本

聯絡人--需要備份的資料,是狀態資料,沒有操作

public

sealed

class

contactperson

//**號碼

public

string mobilenumber

}

發起人--相當於【發起人角色】originator

public

sealed

class

mobilebackoriginator

set }

//初始化需要備份的**名單

public mobilebackoriginator(listpersonlist)

else

}//建立備忘錄物件例項,將當期要儲存的聯絡人列表儲存到備忘錄物件中

public

contactpersonmemento creatememento()

//將備忘錄中的資料備份還原到聯絡人列表中

public

void

restorememento(contactpersonmemento memento)

public

void

show()

個人,他們是:

", contactpersonlist.count);

foreach (contactperson p in

contactpersonlist)

號碼:

", p.name, p.mobilenumber);}}

}

備忘錄物件,用於儲存狀態資料,儲存的是當時物件具體狀態資料--相當於【備忘錄角色】memeto

public

sealed

class

contactpersonmemento

public contactpersonmemento(listpersonlist)

}

管理角色,它可以管理【備忘錄】物件,如果是儲存多個【備忘錄】物件,當然可以對儲存的物件進行增、刪等管理處理---相當於【管理者角色】caretaker

public

sealed

class

mementomanager

public contactpersonmemento contactpersonmemento

}

客戶端**

class

program

,

new contactperson() ,

new contactperson()

};//手機名單發起人

mobilebackoriginator mobileoriginator = new

mobilebackoriginator(persons);

mobileoriginator.show();

//建立備忘錄並儲存備忘錄物件

mementomanager manager = new

mementomanager();

manager.contactpersonmemento =mobileoriginator.creatememento();

//更改發起人聯絡人列表

console.writeline("

----移除最後乙個聯絡人--------");

mobileoriginator.contactpersonlist.removeat(2);

mobileoriginator.show();

//恢復到原始狀態

console.writeline("

-------恢復聯絡人列表------");

mobileoriginator.restorememento(manager.contactpersonmemento);

mobileoriginator.show();

console.read();}}

設計模式練習(16) 備忘錄模式

一 題目 某軟體公司正在開發一款網遊,為了給玩家提供更多方便,在遊戲過程中可以設定乙個恢復點,用於儲存當前的遊戲場景,如果在後續遊戲過程中,玩家角色 不幸犧牲 玩家可以返回到先前儲存的場景,從恢復點開始重新遊戲,試用備忘錄模式實現。1 繪製備忘錄模式結構檢視 2 給出例項類圖並實現 二 所用模式結構...

設計模式 備忘錄模式

錄入大批人員資料。正在錄入當前人資料時,發現上乙個人的資料錄錯了,此時需要恢復上乙個人的資料,再進行修改。word文件編輯時,突然電腦宕機或者斷電,再開啟時,可以看到word提示你恢復以前的文件。就死儲存某個物件內部狀態的拷貝,這樣以後就可以將該物件恢復到原先的狀態。源髮器類originator 備...

設計模式 備忘錄模式

備忘錄模式 memento pattern 在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。涉及角色 1.original 發起人 負責建立乙個備忘錄memento,用以記錄當前時刻自身的內部狀態,並可使用備忘錄恢復內部狀態。ori...