物件導向程式設計思想 備忘錄模式

2021-08-07 11:48:14 字數 3368 閱讀 5784

一、引言

上篇博文中我們分享了訪問者模式,訪問者模式是把作用於資料結構上的操作封裝到訪問者類中,使得資料結構與操作分離。今天我們要學習的備忘錄模式與命令模式有點相似,不同的是,命令模式儲存的是發起人的具體命令(命令對應行為),而備忘錄模式儲存的是發起人的狀態(狀態對應資料內部結構,如屬性)。下面請看今天要學習的訪問者模式

二、備忘錄模式

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

下面是備忘錄模式的結構圖:

下面是備忘錄模式**demo:

//

發起人class

originator

set

}//通過例項化備忘錄 儲存狀態

public

memento creatememento()

//將備忘錄中狀態恢復給發起人

public

void

setmemento(memento memento)

public

void

show()

");}

}//備忘錄類

class

memento

public

string

state}}

//管理者類,負責儲存備忘錄

分析:把儲存狀態的細節封裝到memento中,這樣哪天更改儲存的細節也不會影響客戶端。使用備忘錄模式可以將複雜物件的內部資訊對其他物件遮蔽起來。當角色狀態改變時,有可能這個狀態無效,可以使用暫時儲存的備忘錄將狀態復原。

下面是多狀態多備份備忘錄例項:

//

遊戲進度類

class

gamestate

//攻擊力

public

string attackpower

//防禦力

public

string defense

}//遊戲發起人

class

gameplayer

public gameplayer(listlstgamestate)

//建立備忘錄,將要儲存的遊戲進度列表匯入備忘錄

public

gamememento creategamememento()

//將備忘錄中資料備份匯入遊戲進度列表

public

void

setgamememento(gamememento gamememento)

}public

void

show()

個進度,分別是");

foreach (gamestate gamestate in

lstgamestate)

,攻擊力,防禦力");}}

}//備忘錄

class

gamememento

public gamememento(listlstgamestate)

}class

gamecaretaker

public

gamecaretaker()

}class

program

,new gamestate(),

new gamestate()

};gameplayer gameplayer = new

gameplayer(lstgamestate);

gameplayer.show();

//建立備忘錄並儲存進度

gamecaretaker gamecaretaker = new

gamecaretaker();

gamecaretaker.dicgamememento.add(datetime.now.tostring(),gameplayer.creategamememento());

//移除最後乙個遊戲進度

gameplayer.lstgamestate.removeat(2

); gameplayer.show();

thread.sleep(

1000

);

//第二次備份

gamecaretaker.dicgamememento.add(datetime.now.tostring(), gameplayer.creategamememento());

//恢復到指定進度

分析:實際應用中,大多情況下用到的是多狀態多備份,如果狀態很大很多,備忘錄物件會很耗記憶體

優點

1.如果某個操作錯誤破壞了資料的完整性,可以使用備忘錄模式恢復原來儲存的資料

2.備份的狀態儲存在發起人之外,這樣發起人就不需要對各個儲存的狀態進行管理。

缺點

1.在實際系統中,可能需要多狀態多備份,對系統資源消耗是比較大的

適用場景

1.如果系統需要提供回滾操作時,使用備忘錄模式是比較方便的。例如資料庫中事務操作,文字編輯器中的ctrl+z撤銷操作

參考:大話設計模式

備忘錄模式

備忘錄模式 memento 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。originator 發起人 負責建立乙個備忘錄memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。originator可根據需要...

備忘錄模式

先從物件導向的三大特徵之一封裝說起。物件導向的封裝簡單點說就是把狀態 資料 和行為 操作這些資料的方法 放到一起,構成乙個單元,通常叫做類。乙個物件的行為是事先確定好的 靜態 一些指令碼,如果物件的狀態相同,物件看起來就是一樣的。所以當我們需要把乙個物件的某一時刻儲存起來,那麼只需要儲存它在那個時刻...

備忘錄模式

面臨問題 物件狀態的變化無端,如何回溯恢復物件在某個點的狀態?在軟體構建過程中,某些物件的狀態在轉換過程中,可能由於某種需要,要求程式能夠回溯到物件之前處於某個點時的狀態。如果使用一些公用介面來讓其他物件得到物件的狀態,便會暴露物件的細節實現。如何實現物件狀態的良好儲存與恢復?但同時又不會因此而破壞...