Head First設計模式之備忘錄模式

2021-09-22 17:27:47 字數 3997 閱讀 2818

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

備忘錄模式中主要有三類角色:

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

2、提供乙個可回滾的操作。

優點:

缺點:

消耗資源。

1、如果類的成員變數過多,勢必會占用比較大的資源,而且每一次儲存都會消耗一定的記憶體。

2、由於備份的資訊是由發起人自己提供的,所以管理者無法預知備份的資訊的大小,存在一定的未知風險。

下面以備份手機通訊錄為例子來實現了備忘錄模式,具體的實現**如下所示:

//

聯絡人public

class

contactperson

public

string mobilenum

}//發起人

public

class

mobileowner

public mobileowner(listpersons)

//建立備忘錄,將當期要儲存的聯絡人列表匯入到備忘錄中

public

contactmemento creatememento()

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

public

void

restorememento(contactmemento memento)

public

void

show()

個人,他們是:

", contactpersons.count);

foreach (contactperson p in

contactpersons)

號碼為:

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

}//備忘錄

public

class

contactmemento

}//管理角色

public

class

caretaker

}class

program

,new contactperson() ,

new contactperson()

};mobileowner mobileowner = new

mobileowner(persons);

mobileowner.show();

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

caretaker caretaker = new

caretaker();

caretaker.contactm =mobileowner.creatememento();

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

console.writeline("

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

mobileowner.contactpersons.removeat(2);

mobileowner.show();

//恢復到原始狀態

console.writeline("

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

mobileowner.restorememento(caretaker.contactm);

mobileowner.show();

console.read();}}

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

using

system.threading.tasks;

namespace

designpatterns.mememto

public

string mobilenum

}//發起人

public

class

mobileowner

public mobileowner(listpersons)

//建立備忘錄,將當期要儲存的聯絡人列表匯入到備忘錄中

public

contactmemento creatememento()

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

public

void

restorememento(contactmemento memento)

}public

void

show()

個人,他們是:

", contactpersons.count);

foreach (contactperson p in

contactpersons)

號碼為:

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

}//備忘錄

public

class

contactmemento

public contactmemento(listpersons)

}//管理角色

public

class

caretaker

public

caretaker()

}class

program

,new contactperson() ,

new contactperson()

};mobileowner mobileowner = new

mobileowner(persons);

mobileowner.show();

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

caretaker caretaker = new

caretaker();

caretaker.contactmementodic.add(datetime.now.tostring(), mobileowner.creatememento());

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

console.writeline("

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

mobileowner.contactpersons.removeat(2);

mobileowner.show();

//建立第二個備份

thread.sleep(1000

); caretaker.contactmementodic.add(datetime.now.tostring(), mobileowner.creatememento());

//恢復到原始狀態

console.writeline("

-------恢復聯絡人列表,請從以下列表選擇恢復的日期------");

var keycollection =caretaker.contactmementodic.keys;

foreach (string k in

keycollection)

", k);

}while (true

)

catch

contactmemento contactmentor = null

;

if (index < keycollection.count && caretaker.contactmementodic.trygetvalue(keycollection.elementat(index), out

contactmentor))

else}}

}}

參考

歡迎閱讀本系列文章:head first設計模式之目錄

Head First設計模式之工廠模式

定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個.工廠方法讓類把例項化推遲到子類 1 抽象工廠角色 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。2 具體工廠角色 它含有和具體業務邏輯有關的 由應用程式呼叫以建立對應的具體產品的物件。3 抽象產品...

《Head First設計模式》之命令模式

命令模式就是將方法呼叫 method invocation 封裝起來。通過封裝方法呼叫,我們可以把運算塊包裝成形,所以呼叫此運算的物件不需要關心事情是如何進行的,只要知道如何使用包裝成形的方法來完成它就可以了。通過封裝方法呼叫,可以用在以下場景 記錄日誌或者重複使用這些封裝來實現撤銷 undo 我對...

Head First設計模式之組合模式

將物件組合成樹形結構來表現 整體 部分 層次結構。組合能讓客戶以一致的方法處理個別物件以及組合物件。主要部分可以被一致對待問題.組合模式主要包含三個角色 2.composite 容器構件 容器節點包含子節點,其子節點可以是葉子節點,也可以是容器節點,它提供乙個集合用於儲存子節點,實現了在抽象構件中定...