大話設計模式C 實現 第18章

2021-12-29 20:27:13 字數 1889 閱讀 8217

一、uml圖

二、概念

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

三、說明

角色:

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

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

(3)caretaker(管理者):負責儲存包備忘錄memento,不能對備忘錄的內容進行操作或檢查。

什麼時候用?

memento模式比較適用於功能比較複雜的,但需要維護或記錄屬性歷史的類,或者需要儲存的屬性只是眾多屬性中的一小部分時,originator可以根據儲存的memento資訊還原到遷移狀態。

與命令模式的關係?

如果在某個系統中使用命令模式時,需要實現命令的撤銷功能,那麼命令模式可以使用備忘錄模式來儲存可撤銷操作的狀態。

四、c++實現

(1)memento.h

#ifndef memento_h

#define memento_h

#include

#include

//memento類,備忘錄,此處為角色狀態儲存箱rolestatememento class

class rolestatememento

int getvitality()

void setvitality(int vit)

int getattack()

void setattack(int atk)

int getdefense()

void setdefense(int def) };

//originator,發起人,此處為遊戲角色,gamerole class

class gamerole

void setvitality(int vit)

int getattack()

void setattack(int atk)

int getdefense()

void setdefense(int def)

void getinitstate()

void fight()

void statedisplay() };

//caretaker,管理者,此處為遊戲角色管理類,rolestatecaretaker class

class rolestatecaretaker

void setmemento(rolestatememento* memento) };

#endif

(2)client.h

#include "memento.h"

#include

#include

void main()

(3)執行截圖

上一篇

大話設計模式C 實現 第25章

一 uml 二 概念 中介者模式 mediator 用乙個中介物件來封裝一系列的物件互動。中介者使各物件不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。三 說明 角色 1 colleague 抽象同事類。2 concreteclleague 具體同事類,每個具體同事只知道自...

大話設計模式C 實現 第1章 簡單工廠模式

一 uml圖 二 包括的角色 簡單工廠模式包括三個角色 1 工廠類factory 工廠類是用來製造產品的。因此,在factory中有乙個用於製造產品的create函式或者generate函式之類的函式。這個函式可以依據 識別符號 的不同生成不同的concreteproduct,當然這些concret...

大話設計模式 第10章 模板方法模式

重複 易錯 難改 既然用了繼承,並且肯定這個繼承有意義,就應該要成為子類的模板,所有重複的 都應該要上公升到父類去,而不是讓每個子類都去重複。當要完成在某一細節層次一致的乙個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同時,通常考慮用模板方法模式來處理。模板 template 方法模式...