设计模式--备忘录模式

来源:互联网 发布:不要和陌生人说话知乎 编辑:程序博客网 时间:2024/05/17 03:36

今晚学习的是属于行为型模式的的备忘录模式。首先,老规矩先是模式的定义:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
备忘录模式的结构图如下:
这里写图片描述
Originator(原发器),Memento(备忘录),Caretaker(管理者)
适用性:
1 必须保存一个对象在某一时刻的(部分)状态,这样以后需要它才能恢复到先前的状态
2 如果一个用接口来让其对象直接得到这些状态,将会暴露对象的实现细节并破坏结构
协作
1 管理器向原发器请求一个备忘录,保留一段时间后,将其发送回原发器。(原发器:原发器创建一个备忘录,用以记录当前时刻他的状态,使用备忘录恢复状态;)但有时管理者不会将备忘录返回给原发器,因为该原发器可能根本不需要返回到上一个状态
2 备忘录是被动的。只有创建备忘录的原发器会对他的状态进行赋值和检索
优点:
1 保持封装边界。可以避免由原发器管理而又存储在原发器之外的信息
2 简化了原发器。
缺点:
1 可能代价会非常高。由于生成备忘录的时候可能需要
2 维护备忘录的代价,管理器负责删除它所维护的状态,但是管理器并不知道备忘录有多少个状态,所以一个本来很小的管理器,可能会产生大量的存储空间
3 在一些语言中难以保证只有于原发器可访问备忘录的状态
例子:

// MementoModel.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "RoleStateCaretaker.h"#include "GameRole.h"#include "RoleStateMemto.h"int _tmain(int argc, _TCHAR* argv[]){    GameRole* gameRole = new GameRole();    gameRole->displayState();    RoleStateCaretaker* careTaker = new RoleStateCaretaker;    careTaker->setMemto(gameRole->saveState());    gameRole->fight();    gameRole->displayState();    gameRole->recoryState(careTaker->getMemto());    gameRole->displayState();    return 0;}/************************************************************************@fileName:GameRole.h @function: 游戏角色类,在备忘录是原发器@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "RoleStateMemto.h"class GameRole{public:    GameRole();    ~GameRole();    void displayState();    RoleStateMemto* saveState();    void recoryState(RoleStateMemto* memto);    void fight();private:    int vit;    int atk;    int def;};#include "GameRole.h"#include <iostream>using namespace std;GameRole::GameRole(){    this->atk = 100;    this->def = 100;    this->vit = 100;}GameRole::~GameRole(){}void GameRole::displayState(){    cout << "atk is " << this->atk<< endl;    cout << "def is " << this->def<< endl;    cout << "vit is " << this->vit<< endl;}RoleStateMemto* GameRole::saveState(){    return (new RoleStateMemto(this->atk,this->vit,this->def));}void GameRole::recoryState(RoleStateMemto* memto){    this->atk = memto->getAtk();    this->vit = memto->getVit();    this->def = memto->getDef();}void GameRole::fight(){    this->atk = 0;    this->vit = 0;    this->def = 0;}/************************************************************************@fileName:RoleStateMemto.h @function: 游戏角色备忘录类,在备忘录是备忘录@author: jaime@ver: 1.0.0************************************************************************/#pragma onceclass RoleStateMemto{public:    RoleStateMemto(int atk, int vit, int def);    ~RoleStateMemto();    int getAtk();    void setAtk(int atk);    int getVit();    void setVit(int vit);    int getDef();    void setDef(int def);private:    int atk;    int vit;    int def;};#include "RoleStateMemto.h"RoleStateMemto::RoleStateMemto(int atk, int vit, int def){    setAtk(atk);    setVit(vit);    setDef(def);}RoleStateMemto::~RoleStateMemto(){}int RoleStateMemto::getAtk(){    return this->atk;}void RoleStateMemto::setAtk(int atk){    this->atk = atk;}int RoleStateMemto::getVit(){    return this->vit;}void RoleStateMemto::setVit(int vit){    this->vit = vit;}int RoleStateMemto::getDef(){    return this->def;}void RoleStateMemto::setDef(int def){    this->def = def; }/************************************************************************@fileName:RoleStateCaretaker.h @function: 游戏角色备忘管理类,在备忘录是管理者@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "RoleStateMemto.h"class RoleStateCaretaker{public:    RoleStateCaretaker();    ~RoleStateCaretaker();    RoleStateMemto* getMemto();    void setMemto(RoleStateMemto* memto);private:    RoleStateMemto* memto;};#include "RoleStateCaretaker.h"RoleStateCaretaker::RoleStateCaretaker(){}RoleStateCaretaker::~RoleStateCaretaker(){}RoleStateMemto* RoleStateCaretaker::getMemto(){    return this->memto;}void RoleStateCaretaker::setMemto(RoleStateMemto* memto){    this->memto = memto;}
0 0
原创粉丝点击