設計模式 備忘錄模式

2021-08-08 23:29:54 字數 2251 閱讀 7999

備忘錄模式又叫做快照模式(snapshot pattern)或token模式,是物件的行為模式。

備忘錄物件是乙個用來儲存另外乙個物件內部狀態的快照的物件。備忘錄模式的用意是在不破壞封裝的條件下,將乙個物件的狀態捕捉(capture)住,並外部化,儲存起來,從而可以在將來合適的時候把這個物件還原到儲存起來的狀態。備忘錄模式常常與命令模式和迭代子模式一同使用。

使用場景:

在做資料更新的時候都會備份乙份某乙個時刻臨時的資料狀態;以便於在特殊時期方便進行資料撤銷,保證資料完整性;

備份兩種方式:

一、淺表備份

淺表備份就是新備份出來的物件除了值型別不是相互引用,引用型別還是公用乙個物件;看如下**執行結果:

[serializable]

public

class address

public

string city

}[serializable]

public

class person

////// 年齡

///public

int age

public

person()

static

void main(string arge)

};//動態的獲取乙個物件的執行狀態--淺表複製

var personcopy = (person)person.memberwiseclone();

console.writeline($"person物件的city原值是:");

console.writeline($"personcopy物件的city原值是:");

person.address.city = "蘇州吳江區";

console.writeline($"person物件的city值是:");

console.writeline($"personcopy物件的city值是:");

console.readline();}}

執行結果:

二、深備份

通過深備份出來的物件,無論是值型別還是引用型別都是全新的;對原來物件的修改不會影響到新物件的字段。

**如下:

iprototype介面定義:

public

inte***ce iprototype

[serializable]

public

class address

public

string city

}

person類:

[serializable]

public

class person:iprototype

////// 年齡

///public

int age

public

person()

////// 位址

///public address address

////// 複製物件的方法

//////

public

object

colne( person person)

static

void main(string arge)

};//動態的獲取乙個物件的執行狀態--深複製

var personcopy = (person)person.colne(person);

console.writeline($"person物件的city原值是:");

console.writeline($"personcopy物件的city原值是:");

console.writeline("將person物件的city賦值成蘇州吳江區");

person.address.city = "蘇州吳江區";

console.writeline($"person物件的city值是:");

console.writeline($"personcopy物件的city值是:");

console.readline();}}

執行結果:

設計模式 備忘錄模式

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

設計模式 備忘錄模式

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

設計模式 備忘錄模式

備忘錄模式是一種行為模式,該模式業內關於儲存物件當前狀態,並且之後可以再次恢復到此狀態。備忘錄模式實現的方式需要保證被儲存的物件狀態不能被物件從外部訪問,目的是為了保護好被儲存的這些物件狀態的完整性以及內部實現不向外暴露。在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態,這樣...